洛谷[P3858] 路标设置
题目背景
B 市和 T 市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最大距离定义为该公路的 “空旷指数”。
题目描述
现在政府决定在公路上增设一些路标,使得公路的“空旷指数”最小。他们请求你设计一个程序计算能达到的最小值是多少。请注意,公路的起点和终点保证已设有路标,公路的长度为整数,并且原有路标和新设路标都必须距起点整数个单位距离。
总结
对二分查找的敏感性--所求答案是单调可查的:以答案为分界,一边为不合法答案,一边为非最优答案。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 5 using namespace std; 6 7 int n, k, l, a[200000], b[200000]; 8 9 bool check(int p) 10 { 11 int sed = k; 12 for (int i = n - 1; i >= 1 && b[i] > p; --i) 13 { 14 sed -= (b[i] / p); 15 if (b[i] % p == 0) sed++; 16 if (sed < 0) break; 17 } 18 if (sed < 0) return false; 19 return true; 20 } 21 22 int binery_search(int l, int r) 23 { 24 if (l == r) return l; 25 int mid = (l + r) >> 1; 26 if (check(mid)) return binery_search(l, mid); 27 else return binery_search(mid + 1, r); 28 } 29 30 int main() 31 { 32 read(l), read(n), read(k); 33 for (int i = 1; i <= n; ++i) 34 { 35 read(a[i]); 36 if (i == 1) continue; 37 b[i - 1] = a[i] - a[i - 1]; 38 } 39 sort(b + 1, b + n); 40 cout << binery_search(1, l); 41 return 0; 42 }

浙公网安备 33010602011771号