P2678 [NOIP2015 提高组] 跳石头
作者:互联网
#include<bits/stdc++.h>
using namespace std;
int l,n,m,a[100010];//与起点的距离
bool check(int d)
{
int last=0,cnt=0;
for(int i=1;i<=n;i++)
{
if(a[i]-last<d)cnt++;
else last=a[i];
}
if(l-last<d)cnt++;
return cnt<=m;
}
int main()
{
scanf("%d%d%d",&l,&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int le=1,r=l+1,mid;
while(le+1<r)//最后一个可行解 第一个不可行解
{
mid=(le+r)/2;
if(check(mid))le=mid;
else r=mid;
}
printf("%d",le);
return 0;
}
如果给定一个距离d,问至少要移走多少石头
才能满足石头之间的最小距离不小于d?
对d进行二分,判断最小距离为d时移走的最少石头数是否会超过M块
标签:NOIP2015,移走,P2678,最小,距离,石头,int,check 来源: https://www.cnblogs.com/whcxyp20070320/p/15875627.html