[TJOI2007] 路标设置 题解

众所周知,我刚刚学了二分。于是决定学以致用。看到一道往年省选,我就动了杀心。于是切了。

由于它的标签是二分,所以我就二分了。观察发现,道路的空旷指数是有序的,所以对这个域二分。很明显,你需要先把原有路标排序,然后才能判断是否放上新的路标。

然后就好做了。时间复杂度 \(O(n \log L)\) .

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 100005;
int L, n, k, a[maxn];
bool check(int d) {
	int cnt = 0;
	for(int i = 2; i <= n; i ++) {
		cnt += (a[i] - a[i - 1]) / d;
		if((a[i] - a[i - 1]) % d == 0) cnt --;
	} if(cnt > k) return false;
	else return true;
}
int main() {
	scanf("%d%d%d", &L, &n, &k);
	for(int i = 1; i <= n; i ++) cin >> a[i];
	sort(a + 1, a + n + 1);
	a[0] = 0;
	a[n + 1] = L;
	int l = 1, r = L, mid;
	while(l < r) {
		mid = l + r >> 1;
		if(check(mid)) r = mid;
		else l = mid + 1;
	} printf("%d", l);
}
posted @ 2021-02-07 18:28  Inversentropir-36  阅读(44)  评论(0编辑  收藏  举报