最开始Subtask #1tle,在翻了讨论区后得之l = 1;这是错误代码,还有改了后从1.25s变成了48ms,啥原因?玄学,到底啥时候l = 1,啥时候l < r && l <= r ?注释给自己(蒟蒻看的
# include<bits/stdc++.h>
using namespace std;
int ll, n, k, a[100005], l, r;
// 空旷指数:两个路标之间距离 ,a存储原空旷指数
void c() {
cin >> ll >> n >> k;//ll,n,k,分别表示公路的长度,原有路标的数量,以及最多可增设的路标数量
for(int i = 0; i < n; i++) {
int fir, sec;//临时变量
cin >> fir;//路标位置
if(i >= 1) a[i] = fir - sec;//只有从第二个路标起才算空旷指数
sec = fir;//记录上一个路标的位置
r = max(a[i], r);//右边界为空旷指数最大
}
}
int main(){
c();
while(l <= r) {
int mid = l + ((r - l) >> 2), cnt = 0, mc;//>>等于/2(运算优先级低,得加括号
//cnt表示加路标的数量 第一个mid = 最大空旷指数一半
for(int i = 1; i < n; i++) {
mc = a[i];//mc临时存储
while(mc > mid) mc -= mid, cnt++;
//加一个路标,直至长度小于mid
}
if(cnt <= k) r = mid - 1;
//若点数小于等于能加的数量,则说明减的线段太长,右边界缩小
else l = mid + 1;
//否则减的线段太短,左边界扩大
}
cout << l;//r也行
return 0;
}