标签:iostream div you return integer Once i+1 math.h while
Input
Output
Sample Input
5 3 1 2 8 4 9
Sample Output
3
翻译:有n间牛房在一条直线上,距离分别是xi,有c只牛,牛在一起容易打架,让牛尽可能在距离比较远的牛房。要安置c只牛,求这个距离最大能是多少?
白书上的二分题目,书上讲得一点都不人性化,能用人话说清楚的非要用鬼话,代码也是不够简洁,看了半个小时都不懂,一搜题解,秒懂,记录一下代码。
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<math.h> 6 #include<string> 7 #define ll long long 8 #define inf 0x3f3f3f3f 9 using namespace std; 10 int n,m; 11 int a[100086]; 12 13 bool check(int d) 14 { 15 int num=1,now=a[0]; 16 for(int i=1;i<n;i++) 17 { 18 if(a[i]-now>=d) 19 now=a[i],num++;///如果a[i]号牛棚距离上一个的距离>=d,更新牛棚位置,并且增加安置的牛数,大于等于m时候就是可行解 20 if(num>=m) 21 return true; 22 } 23 return false; 24 } 25 26 int main() 27 { 28 while(scanf("%d %d",&n,&m)!=EOF) 29 { 30 for(int i=0;i<n;i++) 31 scanf("%d",&a[i]); 32 sort(a,a+n); 33 int l=1,r=a[n-1],ans=0; 34 while(l<=r) 35 { 36 int mid=(l+r)/2; 37 if(check(mid)) 38 { 39 ans=mid;///不断更新可行解,找到最大值, 即最大化 可行解。 40 l=mid+1; 41 } 42 else 43 r=mid-1; 44 } 45 printf("%d\n",ans); 46 } 47 return 0; 48 }
标签:iostream div you return integer Once i+1 math.h while
原文地址:https://www.cnblogs.com/shoulinniao/p/10597777.html