2018-2-6
直接使用二分搜索即可,如果可以满足条件的话,就在mid与high之间,否则的话就在low与mid之间。
在判断给定的d是否能够满足条件时,我用的是贪心的想法,就是让牛尽可能的朝左边的牛棚中去,这样很容易就可以判断出来。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 100000;
int x[N+1];
int n,c,cnt;
bool res(int d){
cnt=1;
int e=x[1];
for (int i=2;i<=n;i++){
if (x[i]-e>=d){
cnt++;
e=x[i];
}
}
return cnt>=c;
}
void div(){
int l=0,h=x[n]-x[1];
while (h-l>1){
int m=(l+h)/2;
if (res(m)) l=m;
else h=m;
}
cout<<l<<endl;
}
int main(){
while (cin>>n>>c){
for (int i=1;i<=n;i++){
scanf ("%d",x+i);
}
sort(x+1,x+n+1);
div();
}
return 0;
}
其实我一直有一个疑问,就是在二分搜索中,high什么时候等于mid,什么时候等于mid-1,low什么时候等于mid,什么时候等于mid+1,返回的值什么时候等于mid,什么时候等于high,什么时候等于low……