[二分答案][NOIP2015]跳石头
跳石头
题目描述
一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石) 。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。
为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能移走起点和终点的岩石) 。
输入
输入文件名为 stone.in。
输入文件第一行包含三个整数 L,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。
接下来 N 行,每行一个整数,第 i 行的整数 Di( 0 < Di < L )表示第 i 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。
输出
输出文件名为 stone.out。
输出文件只包含一个整数,即最短跳跃距离的最大值。
样例输入
25 5 2
2
11
14
17
21
样例输出
4
提示
【输入输出样例 1 说明】
将与起点距离为 2 和 14 的两个岩石移走后,最短的跳跃距离为 4(从与起点距离
17 的岩石跳到距离 21 的岩石,或者从距离 21 的岩石跳到终点) 。
【输入输出样例 2】
见选手目录下的 stone/stone2.in 和 stone/stone2.ans。
【 数据规模与约定 】
对于 20%的数据,0 ≤ M ≤ N ≤ 10。
对于 50%的数据,0 ≤ M ≤ N ≤ 100。
对于 100%的数据,0 ≤ M ≤ N ≤ 50,000,1 ≤ L ≤ 1,000,000,000。
代码:
1 #include<algorithm> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #define int long long 6 7 const int Maxv = 50010; 8 int dp[Maxv], d[Maxv], ans[Maxv], L, n, m; 9 int ans[50005]; 10 11 int read(){ 12 int x = 0, f = 1; 13 char ch = getchar(); 14 while (ch < '0' || ch > '9') { 15 if (ch == '-') { 16 f = -1; 17 } 18 ch = getchar(); 19 } 20 while (ch >= '0' && ch <= '9'){ 21 x = x * 10 + ch - '0'; 22 ch = getchar(); 23 } 24 return x * f; 25 } 26 27 bool check(int x){ 28 int last = 0; 29 int ans = 0; 30 for (int i = 1; i <= n; i++) { 31 if (a[i] - last < x) { 32 ans++; 33 } 34 else { 35 last = a[i]; 36 } 37 } 38 if (ans > m) { 39 return false; 40 } 41 return true; 42 } 43 44 int main(){ 45 L = read(); 46 n = read(); 47 m = read(); 48 for (int i = 1; i <= n; i++) { 49 ans[i] = read(); 50 } 51 a[n + 1] = L; 52 n++; 53 int l = 0, r = L; 54 while (l <= r) { 55 int mid = (l + r) / 2; 56 if (check(mid)) { 57 l = mid + 1; 58 } 59 else { 60 r = mid - 1; 61 } 62 } 63 printf("%d\n",l - 1); 64 }