洛谷[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 }

 

posted @ 2021-09-24 10:28  Christopher_Yan()  阅读(101)  评论(0)    收藏  举报