poj-3258 River Hopscotch (二分)
2016-02-18 15:58
351 查看
题意:奶牛过河游戏,河上有N块石头,河的总宽度为L,一位农夫感觉每个石头之间的间距太小了,所以他想通过移除M块石头来使最小的间距最大化。求最大化后的最小距离(姑且是这个题意吧,英语菜)
思路:通过二分枚举答案,使low=0,high=L,我们在得到石头的位置数组a[1...n]之后加入a[0]=0,a[n+1]=L然后排序。每次二分初始化一个区间左端点p=0,然后对于a[i]-a[p] i=1...n+1与mid进行比较如果小于mid即该区间可被移除,我们可用cnt++计被移除的石头数。跑完循环与输入的M进行比较,如果<=M说明删除的数量符合要求,我们让low=mid+1;如果>m删除的数量过多即间距过大,需要缩小间距,我们让high=mid-1。之后输出high得解。
思路:通过二分枚举答案,使low=0,high=L,我们在得到石头的位置数组a[1...n]之后加入a[0]=0,a[n+1]=L然后排序。每次二分初始化一个区间左端点p=0,然后对于a[i]-a[p] i=1...n+1与mid进行比较如果小于mid即该区间可被移除,我们可用cnt++计被移除的石头数。跑完循环与输入的M进行比较,如果<=M说明删除的数量符合要求,我们让low=mid+1;如果>m删除的数量过多即间距过大,需要缩小间距,我们让high=mid-1。之后输出high得解。
#include <iostream> #include <algorithm> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #include <queue> #define INF 0x3f3f3f3f #define mod 100000000 using namespace std; int a[50010]; int main() { int l,n,m; int i; cin>>l>>n>>m; for(i=1;i<=n;i++) { cin>>a[i]; } a[0]=0;a[n+1]=l; sort(a,a+n+2); int low=0; int high=l,mid; int cnt=0,p=0; while(low<=high) { cnt=0;p=0; mid=(low+high)/2; for(i=1;i<=n+1;i++) { if(a[i]-a[p]<mid) { cnt++; } else p=i; } if(cnt<=m) low=mid+1; else high=mid-1; } printf("%d\n",high); return 0; }
相关文章推荐
- linux下安装apache+php详解
- RevitAPI: 获取图形显示选项 Graphic Display Options
- linux定时任务之crontab命令篇
- Linux目标文件
- 通过rabbitmq的web监控mcollective的状态
- linux tar 解压命令总结
- 我要造轮子之IoC和依赖注入
- python linux定时任务
- Linux 下的超级终端 minicom
- linux C 刚初始化后的一个变量在调用一个静态库中函数后被异常修改为乱码
- Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]
- Tomcat 7优化
- 什么是PV(Page View)?
- 用 Django 做了一个照片分享网站
- yum安装nginx详解
- 研究Tomcat的结构,彻底解决数据源连接数据库
- nginx官网配置
- Linux内核的Oops
- Apache 2.4. 源码编译安装详解
- Ubuntu之Gitlab、Gerrit、Jenkins协调工作配置之部分