社区讨论
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 条回复,欢迎继续交流。
正在加载回复...