AcWing 519. 跳石头
原题链接
中等
作者:
我是java同学
,
2023-02-09 08:51:44
,
所有人可见
,
阅读 192
二分 答案 贪心
- 二分:
- 难点在于check函数的写法。贪心:如果当前石块与上一个石块之间的距离小于二分出的最大距离,那么就把当前石头搬走。如果当前石块与上一个石块之间的距离大于等于二分出的最大距离,那么就记录当前石头(留下当前石头)。
#include <iostream>
using namespace std;
const int N = 50010;
int L, n, m;
int d[N];
bool check(int mid)
{
int last = 0, cnt = 0;
for (int i = 1; i <= n; i ++ )
if (d[i] - last < mid) cnt ++ ;//把d[i]移走
else last = d[i];//更新成当前这块
return cnt <= m;
}
int main()
{
scanf("%d%d%d", &L, &n, &m);
for (int i = 1; i <= n; i ++ ) cin >> d[i];
d[ ++ n] = L;
int l = 0, r = 1e9;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
printf("%d\n", r);
return 0;
}