洛谷P2678
样例:
输入:
25 5 2
2
11
14
17
21
输出:
4
AC代码:
二分枚举区间中的数,check检查枚举的数是否符合条件,并根据检查结果更新相应的区间。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int l,n,m;
int a[maxn];
int check(int d)
{
int cnt=0,ind=0;
for(int i=1;i<=n+1;i++)
{
if(a[i]-a[ind]<d)//石头间距离小于d,移除
cnt++;
else//不移除该石头,更新计算距离的石头
ind=i;
}
return cnt<=m;//移除石头个数与要求个数对比,小于等于符合条件
}
int main()
{
scanf("%d%d%d",&l,&n,&m);
a[n+1]=l;//n+1才是最后一块石头
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int left=0,right=l;
while(left<=right)//对距离进行二分枚举
{
int mid=(left+right)>>1;
if(check(mid))//判断mid是否满足条件
left=mid+1;
else
right=mid-1;
}
printf("%d\n",left-1);//检查的是mid,而left=mid+1,所以最后要-1
return 0;
}