第 1 题:路标设置
思路:二分答案
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N],l,n,k,ans,lt,rt,mid;
bool check(int mid)
{
int t=k;//可放置路标的数量
int now=0;
for(int i=0;i<n&&t>=0;)
{
if(f[i]-now<=mid)now=f[i],i++;//满足,移动当前的位置以及要比较的位置指针
else{
now=now+mid;//满足最大空旷指数的位置放置路标
t--;
}
}
if(t>=0)return true;//路标剩余或者恰巧用完
return false;
}
int main()
{
cin>>l>>n>>k;
for(int i=0;i<n;i++)cin>>f[i];
lt=0,rt=l;
while(lt<=rt)
{
mid=(lt+rt)/2;
if(check(mid))//满足条件,查找是否有更小的值
{
ans=mid;
rt=mid-1;
}
else lt=mid+1;//不满足条件,将范围扩大
}
cout<<ans<<endl;
}