當前位置:
首頁 >
C++路标设置
發布時間:2024/8/1
28
豆豆
B市和T市之間有一條長長的高速公路,這條公路的某些地方設有路標,但是大家都感覺路標設得太少了,相鄰兩個路標之間往往隔著相當長的一段距離。為了便于研究這個問題,我們把公路上相鄰路標的最大距離定義為該公路的“空曠指數”。
現在政府決定在公路上增設一些路標,使得公路的“空曠指數”最小。他們請求你設計一個程序計算能達到的最小值是多少。請注意,公路的起點和終點保證已設有路標,公路的長度為整數,并且原有路標和新設路標都必須距起點整數個單位距離。
輸入格式:
第 1 行包括三個數 l (0<l≤1000,000,000), n (2≤n≤100,000), k,分別表示公路的長度,原有路標的數量,以及最多可增設的路標數量。
第 2 行包括遞增排列的 n 個整數,分別表示原有的 n 個路標的位置。路標的位置用距起點的距離表示,且一定位于區間 (0,l) 內。
輸出格式:
輸出1行,包含一個整數,表示增設路標后能達到的最小“空曠指數”值。
限制:
空間限制:128MByte
時間限制:1秒
樣例:
輸入:
100 2 1
25 60
輸出:
35
這一題的數值比較大,所以我們可以用二分。
設mid為空曠指數,計算出路標總數sum。
如果sum<=k,即路標數過多,就應該增加sum,也就是縮減mid,right=mid。
如果sum>k,即路標數過少,就應該縮減sum,即增加mid,left=mid+1
這里注意一下,while循環中的left不能等于right,否則會陷入死循環。
#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; }總結
- 上一篇: onenote插入代码块的完美解决方法
- 下一篇: ROS教程之ROS问题集