标签:with between comm space bool ons print put agg
5 3 1 2 8 4 9
3
题目OJ链接:http://bailian.openjudge.cn/practice/2456/
题目分析:
(参考http://blog.csdn.net/wuxiushu/article/details/49158843)
题意要表达的是:把C头牛放到N个带有编号的隔间里,使得任意两头牛所在的隔间编号的最小差值最大。例如样例排完序后变成1 2 4 8 9,那么1位置放一头牛,4位置放一头牛,它们的差值为3;最后一头牛放在8或9位置都可以,和4位置的差值分别为4、5,和1位置的差值分别为7和8,不比3小,所以最大的最小值为3。
分析:这是一个最小值最大化的问题。先对隔间编号从小到大排序,则最大距离不会超过两端的两头牛之间的差值,最小值为0。所以我们可以通过二分枚举最小值来求。假设当前的最小值为x,如果判断出最小差值为x时可以放下C头牛,就先让x变大再判断;如果放不下,说明当前的x太大了,就先让x变小然后再进行判断。直到求出一个最大的x就是最终的答案。
本题的关键就在于讨论差值的大小。
1 #include<iostream> 2 #include<algorithm> 3 #include<stdio.h> 4 #include<string.h> 5 using namespace std; 6 const int MAX = 100010; 7 int a[MAX],n,m; 8 9 bool C(int d) 10 { 11 int t = a[0],count = 1; 12 for(int i = 1;i < n;i ++) 13 { 14 if(a[i] - t >= d) 15 { 16 count ++; 17 t=a[i]; 18 if(count >= m) 19 return true; 20 } 21 } 22 return false; 23 } 24 25 26 int solve() 27 { 28 int x = 0,y = a[n-1] - a[0]; 29 while(x <= y) 30 { 31 int mid=(x+y)/2; 32 if(C(mid)) 33 x=mid + 1; 34 else 35 y=mid - 1; 36 } 37 return x - 1; 38 } 39 40 41 int main() 42 { 43 while(~scanf("%d%d",&n,&m)) 44 { 45 for(int i = 0;i < n;i ++) 46 scanf("%d",&a[i]); 47 sort(a,a+n); 48 printf("%d\n",solve()); 49 } 50 return 0; 51 }
标签:with between comm space bool ons print put agg
原文地址:http://www.cnblogs.com/huashanqingzhu/p/7617609.html