原题链接:https://www.luogu.com.cn/problem/P3853
题意解读:相邻路标的最大距离即空旷指数,空旷指数越小,用的路标越多,因此可以根据空旷指数将使用路标情况分成两类:路标数<=K,路标数>K,对空旷指数进行二分即可。
解题思路:
二分的判定条件为,
给定空旷指数,计算需要的路标数
只需遍历每两个相邻路标,如果距离>空旷指数,则在此区间增加的路标数为:距离/空旷指数,如果除不尽向下取整,如果能除尽还要减一
如果增加的路标数<=K,则满足要求,继续二分找更小的空旷指数,否则二分找更大的空旷指数。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int a[N], L, n, k, ans;
bool check(int x)
{
long long cnt = 0;
for(int i = 2; i <= n; i++)
{
int dist = a[i] - a[i - 1];
if(dist > x)
{
if(dist % x == 0) cnt += dist / x - 1; //能除尽增加的路标数
else cnt += dist / x; //除不尽增加的路标数
}
}
return cnt <= k;
}
int main()
{
cin >> L >> n >> k;
for(int i = 1; i <= n; i++) cin >> a[i];
int l = 1, r = L;
while(l <= r)
{
int mid = (l + r) >> 1;
if(check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
cout << ans;
return 0;
}
标签:二分,cnt,P3853,int,洛谷题,mid,路标,空旷 From: https://www.cnblogs.com/jcwy/p/18047236