呃。。最多只有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;
}