疯牛——二分法+贪心
AC代码:
1 //2018.2.22 2 //疯牛(解决最优解问题) 3 #include<iostream> 4 #include<algorithm> 5 #include<cstdio> 6 #include<cstring> 7 #include<cmath> 8 using namespace std; 9 10 const int maxn=100000+10; 11 int n,c; //n表示隔间个数,c表示牛的个数 12 int a[maxn]; //隔间编号 13 14 bool judge(int x){ //x为最小距离,判断最小距离情况下,符合条件的隔间是否大于牛的数目 15 int num=1,tmp=a[0]; 16 for(int i=1;i<n;i++){ 17 if(a[i]-tmp>=x){ 18 num++; 19 tmp=a[i]; 20 if(num>=c) 21 return true; 22 } 23 } 24 return false; 25 } 26 27 void solve(){ //二分法 28 int min=0,max=a[n-1]-a[0]; 29 int mid; 30 while(max>=min){ //重复循环,直到找到最优解 31 mid=(min+max)/2; 32 if(judge(mid)){ 33 min=mid+1; 34 }else{ 35 max=mid-1; 36 } 37 } 38 cout<<max<<endl; 39 } 40 41 int main(){ 42 while(cin>>n>>c){ 43 for(int i=0;i<n;i++){ 44 cin>>a[i]; 45 } 46 sort(a,a+n); 47 solve(); 48 } 49 return 0; 50 }
解决最优解问题可以套用二分搜索模板,这类问题的关键在于judge()判断函数的选取,其余部分直接套用。