路标设置
题解:
二分枚举最小的空旷指数。
另外:
用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;
}