POJ 3258 River Hopscotch(二分)
2015-08-29 07:57
357 查看
本题是二分求最小值最大化。
本题在[0,l]的区间内是满足单调性的,随着长度的递增,所需要拆除的石头数量也是递增的,这就满足了二分的条件。
我们用二分找到拆除石头数量为m的最大值就OK了。
本题在[0,l]的区间内是满足单调性的,随着长度的递增,所需要拆除的石头数量也是递增的,这就满足了二分的条件。
我们用二分找到拆除石头数量为m的最大值就OK了。
#pragma warning(disable:4996) #include <cstdio> #include <algorithm> using namespace std; int a[50005]; int l, n, m; int get(int x){//返回距离最小值>=x时去掉的石头数量 int cnt = 0, i = 1, last = 0; for (i = 1; i <= n + 1; i++){ if (a[i] - last < x)cnt++; else last = a[i]; } return cnt; } int main(){ scanf("%d %d %d", &l, &n, &m); a[0] = 0; for (int i = 1; i <= n; i++)scanf("%d", a + i); a[n + 1] = l; sort(a + 1, a + 1 + n); int low = 0, high = l; while (low + 1 < high){ int mid = (low + high) >> 1; int cnt = get(mid); if (cnt == m)low = mid;//若去掉的石头数量为m,那么答案>=mid,所以low=mid else if (cnt > m)high = mid - 1;//若去掉的石头数量大于m,那么答案<mid,所以high=mid-1 else low = mid + 1;//若去掉石头数量小于m,那么答案>mid,所以low=mid+1 } if (get(high) == m)printf("%d\n", high); else printf("%d\n", low); return 0; }
相关文章推荐
- Linux常用命令 | 目录文件
- ETCD高可用特性学习
- linux grep使用以及grep使用练习
- CentOS 7.0禁用iptables防火墙
- Linux系统编程(时间和日期)
- LinuxDeepin/Unix、Linux shell命令
- Ret Hat Linux系统英文安装中文显示小方框问题解决
- Linux文件系统权限及相关命令
- 理解RESTful架构
- ubuntu12.04下安装Docker
- 详解VS2012发布网站步骤
- linux系统中重置mysql的root密码
- shell练习五
- NGINX开机自动启动
- ecshop二次开发 购物时为每件商品添加备注信息的修改方法
- 同域下跨文档通信iframe和window.open
- Linux备份与恢复
- XenDesktop 设置上班高峰期前预先启动虚拟桌面
- Hadoop里的数据挖掘应用-Mahout——学习笔记<三>
- Spark的Python和Scala shell介绍(翻译自Learning.Spark.Lightning-Fast.Big.Data.Analysis)