poj 3258 River Hopscotch 二分查找
2016-02-24 11:35
127 查看
点击打开链接
题意:题意:牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,
以及每一块石头离牛所在河岸的距离,
现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值 max。
思路;对要保留的最小距离的最大值max进行二分枚举
题意:题意:牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,
以及每一块石头离牛所在河岸的距离,
现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值 max。
思路;对要保留的最小距离的最大值max进行二分枚举
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #define LL long long using namespace std; int a[51000]; int N,n,m; int solve(int low,int high) { int sum,num,zmax=-1; while(low<=high) { int mid=(high+low)/2; sum=mid; num=0; for(int i=1; i<=n+1; i++) { if(sum-(a[i]-a[i-1])>0) ///等于0时就不用删点了 ,删了就错了 { ///因为枚举的是要保留的 最小距离的最大值 sum-=(a[i]-a[i-1]); num++; } else sum=mid; } if(num>m) ///分得组数 >m说明边界值用的太大了 包括的情况比实际多 high=mid-1; else ///分得组数<=m 说明里面有成立的条件只需要标记最大值即可 { ///可能会有多种情况下使 num==m 成立 low=mid+1; zmax=max(mid,zmax); } } return zmax; } int main() { scanf("%d%d%d",&N,&n,&m); for(int i=1; i<=n; i++) scanf("%d",&a[i]); sort(a+1,a+n+1); a[0]=0; a[n+1]=N; printf("%d\n",solve(0,N)); return 0; }
相关文章推荐
- Nginx 变量漫谈(三)
- 如何分析python的性能(linux)
- nginx 用if语句修改query_string
- linux查看内存硬件情况
- 我的网站搬家技巧汇总
- linux web服务器必须正确配置php-f…
- nginx多域名配置与 pathinfo(/ 文件夹形式) URL访问不支持配置
- Apache Apollo配置文件解析
- linux添加新硬盘步骤
- Ubuntu14 Could not open file /var/lib/dpkg/status - open (2: No such file or directory)
- [Linux] rpm 与 dpkg 用法比较
- Opencv— — Color Gradient
- Opencv— — kaleidoscope Filter
- Nginx 502 BAD GateWay错误解决方…
- Opencv— — Circle Filter
- 闲谈Tomcat性能优化
- 如何利用分类信息网让你的网站流量…
- Opencv— — Pinch Filter
- centos6.5 下安装svn一系列操作
- Opencv— — Twirl Filter