瘋牛——二分法+貪心
阿新 • • 發佈:2018-02-23
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()判斷函數的選取,其余部分直接套用。
瘋牛——二分法+貪心