原题: 传送门
题意: 从N个石头(不含起点和终点)中去掉至多M块石头,使得从起点跳到终点的最小步长最大化
思路: 用二分法从0 ~ L枚举最后的答案,如果可以在移动至多M块石头的情况下达成此步长,则继续往(l+r)/2 ~ L搜索,否则就往l ~ (l+r)/2搜索一直到l > r 为止
注意: 把起点和终点也加进去,方便计算第一个石头到起点的距离和终点到最后一个石头的距离
Code:
#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int l, m, n;
int stone[60007];
bool check (int x) {
int now = 0;
int cnt = 0;
for (int i=1;i<=n+1;i++) {
if (stone[i] - stone[now] < x) {
cnt++;
} else {
now = i;
}
}
return cnt <= m;
}
int search (int l, int r) {
int ans = 0;
int mid;
while (l <= r ) {
mid = (l+r) / 2;
if (check(mid)) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin>>l>>n>>m;
for (int i=1;i<=n;i++) {
cin>>stone[i];
}
stone[n+1] = l;
cout<<search(0, stone[n+1])<<endl;
return 0;
}