路标设置【二分模拟】

这篇博客探讨了一道编程题目,涉及到路标设置问题。作者首先尝试使用优先队列来解决,但发现这种方法是错误的。然后,他们转向了模拟和二分搜索的解决方案,通过二分枚举最小的空旷指数来确保满足题目条件。最终,代码实现了一个检查函数,用于判断给定的空旷指数是否可行,并通过二分搜索找到满足条件的最小值。
摘要由CSDN通过智能技术生成

路标设置

题解:

二分枚举最小的空旷指数。

另外:
用ans记录一下最后一个符合题意的值,即可保证改二分不出错。

感想:

虽然很基础,但是(),这题我最初写的优先队列,找出最大的空往中间插入一个路障,是错误的。

代码:

#include<bits/stdc++.h>
using namespace std;
#define sc scanf
#define pr printf
//n<=1e5,k<=1e5,l<=1e7
const int maxn=1e5+3;
int a[maxn];
/*
priority_queue<int>s;
 int main()
 {
 	int l,n,k;cin>>l>>n>>k;
 	for(int i=0;i<n;i++){
            sc("%d",&a[i]);
            if(i) s.push(a[i]-a[i-1]);
 	}
    while(k--){
        int now=s.top();
        int l=now/2;
        int r=now-l;
        s.pop();
        s.push(l),s.push(r);
    }
    pr("%d",s.top());

 }*/
 //模拟+二分
int l,n,k;
int ans;
 bool check(int mid){
     int now=0,t=0;
     //cout<<"2"<<endl;
     for(int i=1;i<n;i++){
        while(a[i]-now>mid)now+=mid,t++;
        now=a[i];
     }
     if(t>k)return 1;//不可行
     else return 0;

 }
int main(){
   cin>>l>>n>>k;int mid;
 	for(int i=0;i<n;i++){
            sc("%d",&a[i]);
 	}
 	int l0=0,r0=l;
 	//cout<<"1"<<endl;
    while(l0<=r0){
        mid=(l0+r0)/2;
        if(check(mid))l0=mid+1;
        else r0=mid-1,ans=mid;
    }
    cout<<ans<<endl;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值