已过,有个问题
查看原帖
已过,有个问题
1138325
MC_dream_tsr楼主2024/9/8 15:54

最开始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;
}
2024/9/8 15:54
加载中...