POJ 2456 Aggressive cows(最小值最大化+二分)
2015-11-14 17:19
411 查看
http://poj.org/problem?id=2456
题意:把C头牛放到N个带有编号的隔间里,使得任意两头牛所在的隔间编号的最小差值最大。例如样例排完序后变成1 2 4 8 9,那么1位置放一头牛,4位置放一头牛,它们的差值为3;最后一头牛放在8或9位置都可以,和4位置的差值分别为4、5,和1位置的差值分别为7和8,不比3小,所以最大的最小值为3。
解题思路:
以后看见求最小值中的最大值或者求最大值中的最小值,都要想到用二分这种模板。
用求最小值中的最大值来写的大致思路:
首先将要处理的序列从小到大sort一次
然后求出最小值能取得范围为[0,arr
-arr[1]]。即最小值最小为0,最大可取的最小值为 arr
-arr[1]。
将最小值可取的这个范围进行二分。如果check满足,就继续找更大的符合条件的x,直到l>r为止。
题意:把C头牛放到N个带有编号的隔间里,使得任意两头牛所在的隔间编号的最小差值最大。例如样例排完序后变成1 2 4 8 9,那么1位置放一头牛,4位置放一头牛,它们的差值为3;最后一头牛放在8或9位置都可以,和4位置的差值分别为4、5,和1位置的差值分别为7和8,不比3小,所以最大的最小值为3。
解题思路:
以后看见求最小值中的最大值或者求最大值中的最小值,都要想到用二分这种模板。
用求最小值中的最大值来写的大致思路:
首先将要处理的序列从小到大sort一次
然后求出最小值能取得范围为[0,arr
-arr[1]]。即最小值最小为0,最大可取的最小值为 arr
-arr[1]。
将最小值可取的这个范围进行二分。如果check满足,就继续找更大的符合条件的x,直到l>r为止。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long LL; const int N = 100000 + 100; LL arr ; int n,c; bool check(LL x) { LL tmp = arr[0] + x; int cnt = 1; for(int i=1;i<n;i++) { if(arr[i]>=tmp) { cnt++; tmp = arr[i] + x; if(cnt==c) return true; } } return false; } int binsearch(LL l,LL r) { LL mid; while(l<=r) { mid = (l+r)/2; if(check(mid)) l = mid +1; else r = mid-1; } return l-1; } int main() { scanf("%d %d",&n,&c); for(int i=0;i<n;i++) { scanf("%lld",&arr[i]); } sort(arr,arr+n); printf("%d\n",binsearch(0,arr[n-1]-arr[0])); return 0; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- POJ 1200 Crazy Search(简单哈希)
- 【高手回避】poj3268,一道很水的dijkstra算法题
- POJ 1088 滑雪
- poj2387 Til the Cows Come Home—Dijkstra模板