题目链接:
[NOIP2015 提高组] 跳石头 - 洛谷https://www.luogu.com.cn/problem/P2678
一道不那么容易想到用二分做的二分题,需要用二分法枚举答案,找到最大的符合题意的答案。由于是找最大的符合题意的结果,可以用 left < right 型的偏右二分。
收获:二分可以偏左也可以偏右,用哪个看题目要求,如果是找第一个符合题意的数,就是左偏。找最后一个符合题意的,就是右偏。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e4+5;
int far, n, m; //距离,岩石数,拿走岩石数
int len[maxn];
bool check(int mid){
int c = 0; //左边界
int num = 0; //拿走岩石数
for(int i=1; i<=n; i++){
if(len[i]-c < mid) num++;
else c = len[i];
}
if(far-c < mid) num++; //检查最后跳到终点是否大于mid
return num <= m;
}
int main(){
cin >> far >> n >> m;
for(int i=1; i<=n; i++){
cin >> len[i];
}
int left = 1, right = far;
while(left < right){
int mid = left + (right-left+1)/2; //偏右二分
if(check(mid)) left = mid;
else right = mid-1;
}
cout << left << endl;
}