C++路标设置
B市和T市之間有一條長(zhǎng)長(zhǎng)的高速公路,這條公路的某些地方設(shè)有路標(biāo),但是大家都感覺路標(biāo)設(shè)得太少了,相鄰兩個(gè)路標(biāo)之間往往隔著相當(dāng)長(zhǎng)的一段距離。為了便于研究這個(gè)問題,我們把公路上相鄰路標(biāo)的最大距離定義為該公路的“空曠指數(shù)”。
現(xiàn)在政府決定在公路上增設(shè)一些路標(biāo),使得公路的“空曠指數(shù)”最小。他們請(qǐng)求你設(shè)計(jì)一個(gè)程序計(jì)算能達(dá)到的最小值是多少。請(qǐng)注意,公路的起點(diǎn)和終點(diǎn)保證已設(shè)有路標(biāo),公路的長(zhǎng)度為整數(shù),并且原有路標(biāo)和新設(shè)路標(biāo)都必須距起點(diǎn)整數(shù)個(gè)單位距離。
輸入格式:
第 1 行包括三個(gè)數(shù) l (0<l≤1000,000,000), n (2≤n≤100,000), k,分別表示公路的長(zhǎng)度,原有路標(biāo)的數(shù)量,以及最多可增設(shè)的路標(biāo)數(shù)量。
第 2 行包括遞增排列的 n 個(gè)整數(shù),分別表示原有的 n 個(gè)路標(biāo)的位置。路標(biāo)的位置用距起點(diǎn)的距離表示,且一定位于區(qū)間 (0,l) 內(nèi)。
輸出格式:
輸出1行,包含一個(gè)整數(shù),表示增設(shè)路標(biāo)后能達(dá)到的最小“空曠指數(shù)”值。
限制:
空間限制:128MByte
時(shí)間限制:1秒
樣例:
輸入:
100 2 1
25 60
輸出:
35
這一題的數(shù)值比較大,所以我們可以用二分。
設(shè)mid為空曠指數(shù),計(jì)算出路標(biāo)總數(shù)sum。
如果sum<=k,即路標(biāo)數(shù)過多,就應(yīng)該增加sum,也就是縮減mid,right=mid。
如果sum>k,即路標(biāo)數(shù)過少,就應(yīng)該縮減sum,即增加mid,left=mid+1
這里注意一下,while循環(huán)中的left不能等于right,否則會(huì)陷入死循環(huán)。
#include<iostream> #include<algorithm> using namespace std; long long l,k,n,a[100010],b[100010],sum,mid; void ef(int left,int right) {while(left<right) {sum=0;mid=(left+right)/2;for(int i=n; i>=0; i--) {sum+=(b[i]/mid);if(b[i]%mid==0) sum--;if(b[i]<mid) break;}if(sum<=k) right=mid;else if(sum>k) left=mid+1;}cout<<right; } int main() {cin>>l>>n>>k;for(int i=1; i<=n; i++) {cin>>a[i];b[i-1]=a[i]-a[i-1];}b[n]=l-a[n];sort(b,b+n+1);ef(0,l);return 0; }總結(jié)
- 上一篇: onenote插入代码块的完美解决方法
- 下一篇: ROS教程之ROS问题集