社区讨论

90分求助~sub也WA了!

P2678[NOIP 2015 提高组] 跳石头参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lw0oxzu9
此快照首次捕获于
2024/05/10 21:06
2 年前
此快照最后确认于
2024/05/11 00:50
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int l,n,m,a[50010],ans;
/*
二分的部分,其实是找到最大的最小距离是否合法
如果这个距离足够大,但是要移开的石头数超出了最多的给定量,就不合法
所以要在满足合法的条件下找最大的最小值 
*/
bool check(int k)//判断若最小距离mid,需要移走的石头数是否<=m 
{
	int tmp=0,sum=0;//目前跳到的位置,和移走的石头数量
	for(int i=1;i<=n;i++)
	{
		if(a[i]-tmp<k) sum++;//跳跃距离小于k,就移走石头等下次跳 
		else tmp=a[i];//否则就跳到这块石头上 
	}
	if(sum<=m) return 1;//移走的石头数小于m,即办法可行 
	return 0; 
}
 
int main()
{
	cin>>l>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	a[n+1]=l;//终点看作一个石头,坐标是l 
	int L=0,R=1e9;
	while(L<=R)
	{
		int mid=(L+R)/2;
		if(check(mid))//如果移开的石头数<=m 
		{
			ans=max(ans,mid);//合法就输出最大距离
			L=mid+1; //如果可以,就继续往多移的石头找 
		 } 
		 else R=mid-1;//如果虽然距离大,但移走的石头太多,就往少了找 
	 }
	 cout<<ans; 
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...