洛谷 P3853 解題報告
阿新 • • 發佈:2018-05-06
space source std #define cpp last clas 地方 排列
P3853 路標設置
題目背景
B市和T市之間有一條長長的高速公路,這條公路的某些地方設有路標,但是大家都感覺路標設得太少了,相鄰兩個路標之間往往隔著相當長的一段距離。為了便於研究這個問題,我們把公路上相鄰路標的最大距離定義為該公路的“空曠指數”。
題目描述
現在政府決定在公路上增設一些路標,使得公路的“空曠指數”最小。他們請求你設計一個程序計算能達到的最小值是多少。請註意,公路的起點和終點保證已設有路標,公路的長度為整數,並且原有路標和新設路標都必須距起點整數個單位距離。
輸入輸出格式
輸入格式:
第1行包括三個數L、N、K,分別表示公路的長度,原有路標的數量,以及最多可增設的路標數量。
第2行包括遞增排列的N個整數,分別表示原有的N個路標的位置。路標的位置用距起點的距離表示,且一定位於區間[0,L]內。
輸出格式:
輸出1行,包含一個整數,表示增設路標後能達到的最小“空曠指數”值。
最開始想錯了
貪心:每次取最大區間插中點。
正解:二分答案,check時加點
CODE:
#include <cstdio>
#include <algorithm>
#define mid (l+r>>1)
using namespace std;
const int N=100010;
int L,n,k,a[N];
bool check(int d)
{
int last=0,cnt=k;
for(int i=1;i<=n;i++)
{
while (a[i]>last+d)
{
cnt--;
last+=d;
}
last=a[i];
if(cnt<0)
return false;
}
return true;
}
int main()
{
scanf("%d%d%d",&L,&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
sort(a+1,a+1+n);
a[++n]=L;
int l=1,r=L;
while(l<r)
{
if(check(mid))
r=mid;
else
l=mid+1;
}
printf("%d\n",l);
return 0;
}
2018.5.5
洛谷 P3853 解題報告