2014ACM 北京邀请赛 B题

来源:互联网 发布:mediawiki数据导入 编辑:程序博客网 时间:2024/05/05 03:41
呃。。最多只有40棵树,四重循环暴力求解。。不过不清楚怎么考虑有树重合的情况。。
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;int a[45];bool vis[45];int binsearch(int n, int num){    int l = 0, r = n-1;    while(l<=r){        int mid = (l+r)>>1;        if(a[mid] == num) return mid;        else if(num < a[mid]) r = mid-1;        else l = mid+1;    }    return l;}int main(){    int n;    while(~scanf("%d", &n)){        for(int i=0; i<n; i++)            scanf("%d", &a[i]);        sort(a, a+n);        int minstep = n-1;        for(int i=0; i<n-1; i++){            for(int j=1; j<n; j++){                int d = a[j] - a[i]; //枚举公差                for(int k=0; k<n; k++){ //枚举基准点                    int step = 0;                    memset(vis, 0, sizeof(vis));                    for(int r=0; r<n; r++){ //计算目标数列的每一项                        int bk = a[k] + (r-k)*d;                        int pos = binsearch(n, bk);                        if(pos >= n) step++;                        else if(vis[pos]) step++;                        else vis[pos] = 1;                    }                    if(step < minstep) minstep = step;                }            }        }        printf("%d\n", minstep);    }    return 0;}

0 0