NOIP 2015 D2T1 跳石头
2016-07-03 15:09
239 查看
题目描述
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点。为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳 跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能 移走起点和终点的岩石)。
【题目分析】
贪心的话,试一试这组数据(4 2 2 3 2)间距,移走3个石头。很显然,贪心不对。那么判断是十分简单的(实在跳不过去就移走),然后二分,判定。就可以了。
【代码】
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点。为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳 跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能 移走起点和终点的岩石)。
【题目分析】
贪心的话,试一试这组数据(4 2 2 3 2)间距,移走3个石头。很显然,贪心不对。那么判断是十分简单的(实在跳不过去就移走),然后二分,判定。就可以了。
【代码】
#include <cstdio> #include <algorithm> #define ma 50011 using namespace std; int n,m,L,s[ma]; int main() { scanf("%d%d%d",&L,&n,&m); for(int i=1;i<=n;i++) scanf("%d",s+i); sort(s+1,s+n+1); s[n+1]=L; int l=0,r=L; while(l<r) { int mid=((l+r)>>1)+1,k=0,st=0; for(int i=1;i<=n+1;i++) { if(s[i]-s[st]<mid) k++; else st=i; } if(k>m) r=mid-1; else l=mid; } return printf("%d",l),0; }
相关文章推荐
- quartz集群分布式(并发)部署解决方案-Spring
- linux 查看内核版本或系统版本
- ViewPager 自动切换
- 《高效能人士的执行4原则 》读后感
- HTML5 canvas beginPath() 方法
- 链表实现表结构
- Merge Two Sorted Lists
- jsp页面分享到QQ空间、微信、微博、人人网等
- 视频录制工具
- c++ 写.mat格式文件
- TCP /IP 协议-(传输层)UDP协议
- JavaWeb概述(二)
- python学习之路-9 socket网络编程
- Java中public,private,protected,和默认的区别
- android 显式 隐式启动activity
- MongoDB c++ driver(五)
- 详解 jupyter notebook 集成 spark 环境安装
- DBImport v3.5 中文版发布:数据库定时同步及文档生成工具(IT人员必备)
- 相信
- oracle 判断非空字段