P3853 [TJOI2007]路标设置

该博客介绍了如何解决P3853路标设置问题,利用二分法寻找最小的“空旷指数”。内容中提到,在路标数组中,若相邻路标间距离大于当前mid,则需要补足路标,通过将mid作为最大距离除以两路标间距(向下取整)计算所需路标数。若总数超过实际路标数,则增大mid,否则降低mid以寻找最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

#include<bits/stdc++.h>
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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值