NOIp2015 跳石头
来源:互联网 发布:下载cad制图软件 编辑:程序博客网 时间:2024/04/28 12:56
一年一度的“跳石头”比赛又要开始了!
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有
为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走
输入格式
输入文件第一行包含三个整数
接下来
输出格式
输出文件只包含一个整数,即最短跳跃距离的最大值。
样例一
input
25 5 2
2
11
14
17
21
output
4explanation
将与起点距离为
限制与约定
本题考察了贪心和二分的知识。
在这题中,给一个起点和终点,在起点和终点中有N块石头,求移走M块石头后最短距离的最大值。
我们可以比较容易的想出贪心的策略:找到一个dist,使移走M块石头后距离的最小值不大于dist。
这道题比较暴力暴力的做法就是枚举dist,找到dist的最大值。算法复杂度O(L)。
很显然,在这道题中使得不了全部的分数。由于dist的枚举过程是单调的,所以我们可以二分这个dist。算法复杂度O(logL)。
#include<cmath>#include<vector>#include<cstdio>#include<string>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define MAXN 50000using namespace std;int L,N,M,m = 0;int D[MAXN+10];void init(){ cin >> L >> N >> M; for (int i = 1; i <= N; i++) scanf("%d",&D[i]); D[++N] = L; N++;}int check(int dist){ int sum = 0,lastPos = 0; for (int i = 1; i < N; ++i){ if (D[i] - D[lastPos] < dist) sum++;//移走石头,计算移走石头的数量 else lastPos = i; } return sum <= M;}void solve() { int l = 1, r = L +10;//这里要比L大一点 //二分答案 while(l + 1 < r) { int mid = (l+r)/2; if (check(mid)) l = mid; else r = mid; } printf("%d\n", l);}int main(){ init(); solve(); return 0;}
- 【NOIP2015】day2_ 跳石头
- NOIp2015 跳石头
- [noip2015] 跳石头
- NOIP2015 跳石头 二分
- Noip2015 D2T1 跳石头
- 【NOIP2015】Day2T1 跳石头
- NOIP2015跳石头
- NOIP2015跳石头
- noip2015跳石头
- 【NOIP2015】 跳石头
- [noip2015]跳石头 题解
- NOIP2015跳石头
- Noip2015 跳石头[vijos 1981]
- 【NOIP2015提高组】跳石头
- 【noip2015】【Day2】【跳石头】【字串】
- 【NOIP2015】洛谷2678 跳石头
- 【NOIP2015】跳石头 【二分答案】
- [NOIP2015] day2 T1 跳石头
- {题解}[jzoj3396] 【NOIP2013模拟】Rainbow的信号
- 【NOIP2013模拟】Rainbow的信号
- Python Numpy.ndarray ValueError:assignment destination is read-only
- sdut 2878 Circle 高斯消元
- OC 习题:股票K线计算
- NOIp2015 跳石头
- oracle导入csv文本文件到vertica
- DataInputString
- maven整合:最新ssm框架实现spring4.2,springmvc4.2,mybatis3.2
- zoj(1095)
- 虚函数
- ASIHttpRequest使用详解
- 最小生成树 Kruskal算法
- STL之Set自定义排序