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块

传送门

上一篇:一沙框架(C# yishaadmin)云服务器部署方法


下一篇:(每日一练python)N 皇后