POJ 2456 Aggressive cows(二分+贪心)
来源:互联网 发布:网络诽谤治安处罚 编辑:程序博客网 时间:2024/05/16 05:55
POJ 2456 Aggressive cows(二分+贪心)
http://poj.org/problem?id=2456
题意:
数轴上有n个不同的点, 现在要你选出C个来(C<=n),使得任意两个被选的点之间的距离尽量大. 问你这个距离是多少?
分析:
首先我们二分这个距离值为L,然后我们看看任意两个点之间的距离>=L时,是否能放下这个C个点?
如何判断是否能放下呢?我们只需要从第一个点开始从前往后贪心的选择即可. 只要当前被选的点与前一个被选的点距离>=L,那么我们就选择这个点. 如果最后能放下C个点就可行.如果不能放下C个点,就算你用其他方法依然会发现不可行.
为什么贪心法正确呢?
(假设我们的选择顺序是从左向右选,即如果我们当前选了第i个点做牛栏,那么前i-1个点不管选没选过,我们都不会考虑了)首先第一个点是必须选的,因为如果你不选第一个点而选其他点作为第一个牛栏,那么还不如选第一个点作为第一个牛栏呢.(因为选第一个点作为牛栏会使得你第2个牛栏有更多的选择空间)
那么第一个点是必须选的,如果下一个点距离第1个点>=L的话,那么它也是必须选的,理由同样. 你选了这个点后,后续牛栏的选择空间将更大.
以此类推,贪心算法可以得到正确的解.
注意题目中二分mid的处理:这里如果写 mid=(R+L)/2将死循环,因为这样mid是偏向0的,而不偏向L或R. 而mid=L+(R-L+1)/2时,mid偏向R的. mid=L+(R-L)/2时,mid偏向L的.
当mid偏向L时,如果L+1==R,那么mid==L.
当mid偏向R时,如果L+1==R,那么mid==R.
当mid偏向0时,如果L+1==R,那么mid==离0更近的那个数.(R或L,这种情况当L或R可负可正时一定要注意.刘汝佳<<入门经典>>P142第三段有解释)
AC代码:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=100000+5;int n,c;//点数,牛栏数int x[maxn];//n个点的坐标bool ok(int dist){ int num=1; //当前选的点数目 int pre=x[1];//已经选了第1个点 for(int i=2;i<=n;i++) { if(x[i]-pre>=dist)//第i个点可以被选 { pre=x[i]; if(++num >=c) return true; } } return false;}int main(){ while(scanf("%d%d",&n,&c)==2) { for(int i=1;i<=n;i++) scanf("%d",&x[i]); sort(x,x+n); //二分处理最小距离 int L=1,R=1e9; while(R>L) { //使mid更偏向R,否则当R==L+1时,会死循环 int mid=L+(R-L+1)/2; if(ok(mid)) L=mid; else R=mid-1; } printf("%d\n",L); } return 0;}
- poj 2456 Aggressive cows(贪心+二分)
- POJ 2456 Aggressive cows(二分+贪心)
- poj 2456 Aggressive cows(贪心+二分)
- POJ 2456 Aggressive cows(贪心+二分)
- [二分+贪心] poj 2456 Aggressive cows
- POJ 2456 Aggressive cows (二分 + 贪心)
- POJ 2456 Aggressive cows (贪心 + 二分)
- poj 2456 Aggressive cows 二分+贪心
- POJ 2456 Aggressive cows (二分、贪心)
- Poj 2456 Aggressive cows【贪心+二分】
- Poj 2456 Aggressive cows ( 二分+贪心
- POJ 2456 Aggressive cows<二分贪心>
- POJ 2456 Aggressive cows(二分+贪心)
- [POJ](2456)Aggressive cows ---二分查找+贪心(查找+贪心)
- poj 2456 Aggressive cows (二分+贪心) (最大化最小值)
- poj 2456 Aggressive cows (二分+贪心思想)
- POJ 2456 Aggressive cows(二分+贪心验证)
- POJ 2456 Aggressive cows 二分
- HDU 1030 Delta-wave 数学题解
- 统计文本中各单词出现的频率(JavaWeb)
- MDS(multidimensional scaling)多维尺度分析
- javascript里的条件判断
- 【智能车新手入门】-赛车行驶策略
- POJ 2456 Aggressive cows(二分+贪心)
- hdu-1527
- CentOS──xxx is not in the sudoers file解决方法
- cracking the coding interview No1.8
- 针对android方法数64k的限制,square做出的努力
- 项目结构、包、编译为exe!
- MyEclipse中更换JDK及工程警告问题
- 人机博弈-吃子棋游戏(四)搜索算法
- Ubuntu下安装eclipse