1. 程式人生 > >洛谷 P3853 解題報告

洛谷 P3853 解題報告

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 解題報告