1. 程式人生 > >瘋牛——二分法+貪心

瘋牛——二分法+貪心

for sort cin ima bool info 代碼 esp span

技術分享圖片

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()判斷函數的選取,其余部分直接套用。

瘋牛——二分法+貪心