1. 程式人生 > >『P3853』路標設定

『P3853』路標設定

題目地址

題目背景

B市和T市之間有一條長長的高速公路,這條公路的某些地方設有路標,但是大家都感覺路標設得太少了,相鄰兩個路標之間往往隔著相當長的一段距離。為了便於研究這個問題,我們把公路上相鄰路標間的最大距離定義為該公路的“空曠指數”。

題目描述

現在政府決定在公路上增設一些路標,使得公路的“空曠指數”最小。他們請求你設計一個程式計算能達到的最小值是多少。請注意,公路的起點和終點保證已設有路標,公路的長度為整數,並且原有路標和新設路標都必須距起點整數個單位距離。

 

輸入格式:

第1行包括三個數 L、N、K,分別表示公路的長度,原有路標的數量,以及最多可增設的路標數量。

第2行包括遞增排列的 N 個整數,分別表示原有的 N 個路標的位置。路標的位置用距起點的距離表示,且一定位於區間 [0,L] 內。

輸出格式:

輸出1行,包含一個整數,表示增設路標後能達到的最小“空曠指數”值。

輸入樣例:

101 2 1

0 101

 

輸出樣例:

51

解題思路:參考跳石頭

 

code

 1 #include<bits/stdc++.h>
 2 #define N 10000005
 3 using namespace std;
 4 int l,n,k,a[N];
 5 
 6 int f(int dis,int
k) { //注意細節的處理 7 if(dis<k) return 0; 8 return dis%k==0?dis/k-1:dis/k; 9 } 10 11 bool check(int x) { 12 int tot=0; 13 for(int i=1;i<=n+1;i++) { 14 tot+=f(a[i]-a[i-1],x); 15 if(tot>k) return 0; 16 } 17 return 1; 18 } 19 20 int main() { 21 scanf("%d%d%d"
,&l,&n,&k); 22 a[0]=0,a[n+1]=l; //題目的坑點 23 int l=0,r=0,ans; 24 for(int i=1;i<=n;i++) 25 scanf("%d",&a[i]),r=max(r,a[i]-a[i-1]); 26 r=max(r,a[n+1]-a[n]); 27 while(l<=r) { //二分答案 28 int midd=l+r>>1; 29 if(check(midd)) r=midd-1,ans=midd; 30 else l=midd+1; 31 } 32 printf("%d",ans); 33 }