P3853 [TJOI2007]路标设置

https://www.luogu.org/problemnew/show/P3853

1.用二分法慢慢寻找最小的“空旷指数”,假设目前的mid是一个最小的“空旷指数”,那么在a数组(路标数组)里每两个相邻间的路标距离一定要小于等于目前的mid, 如果大于,那就必须使用一些路标去填补这个距离。

2.那么怎么去补呢?由于目前mid已是最大距离,填补时两路标距离一定<=mid,那么当然用mid啦!只要用这个距离÷mid就可以得到所需的路标啦(如果除的通必须减一哦,正确率的教训QWQ)。

3.如果所用路标总数大于你所拥有的路标,这个mid就不合格,这时就要增大mid满足条件。如果小于等于,那么就合格,这时就要降低mid的大小来寻找最小值。

#include
using namespace std;
int l,n,k;
int a[100005];
int L,R; 
bool check(int dis){//判断mid是否满足条件的函数~~~
    int cnt=0;//记录所用路标的个数
    for(int i=0;i<=n;i++){
        if(a[i+1]-a[i]>dis){
            cnt+=(a[i+1]-a[i])/dis;
            if((a[i+1]-a[i])%dis==0)
                cnt--;
        }

        if(cnt>k) return false;//不满足条件
    }
    return true;//满足条件
} 
int main(){
    scanf("%d%d%d",&l,&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    L=0;R=10000005;//表示懒得动脑qwq
    a[0]=0;//注意题目的坑点,前后都不能丢
    a[n+1]=l;
    int ans;
    while(L<R){
        int mid=(L+R)/2;
        if(check(mid)) R=mid;
        else L=mid+1;
    }
    cout<<L;
} 

你可能感兴趣的:(二分答案)