一、题目内容 POJ 2456 原题地址 二、题意解释 有n个牛栏,选m个放进牛,相当于一条线段上有 n 个点,选取 m 个点, 使得相邻点之间的最小距离值最大 三、代码及注释 #include<cstdio> #include<algorithm> using namespace std; //思路:这种题有一个统一模式:设定一个判定函数用于判断数据是否符合条件,用二分查找不断获得数据 const int INF=200005; int n,m; int X[100001]; //判断函数 bool judge(int d) { int crt=X[0]; int num=1; for(int i=1; i<n; i++) { if((X[i]-crt)>=d) { crt=X[i]; num++; if(num>=m) return true;//判断是否能安排所有的牛 } } return false; /*int last=0; for(int i=1;i<m;i++){ int crt=last+1; while(crt<n&&X[crt]-X[last]<d){ crt++; } if(crt==n) return false; last=crt; } return true;*/ } void solve() { sort(X,X+n); int left=0,right=X[n-1]-X[0];//注意这里的right int mid; while(right-left>1)//这个二分查找必须这么写,涉及到整数的问题 { int mid=(left+right)/2; if(judge(mid)) left=mid; else right=mid; } printf("%d\n",left);//这里应该选小值,right-left=1 } int main() { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) { scanf("%d",&X[i]); } solve(); return 0; }