P2678跳石头

思路:
二分答案
1.最优解
2.跳跃距离设置的越大,移除的石头数越多——单调性
3.向右找——最大值
4.lst(last)标识:上一块不移走的岩石 的下标
#include<bits/stdc++.h>
#define MAXN 50005
using namespace std;
int L,N,M,d[MAXN],lft,rgt,mid;
bool check(int x)
{
int lst=0,cnt=0;
for(int i=1;i<=N;++i){
if(d[i]-d[lst]<x)//这一块岩石需要移走
cnt++;
else//上一块不移走的岩石编号是i
lst=i;
}
if(L-d[lst]<x)
cnt++;
return cnt<=M;
}
int main()
{
cin>>L>>N>>M;
for(int i=1;i<=N;++i)
scanf("%d",&d[i]);
lft=1,rgt=L;
while(lft<rgt){
mid=(lft+rgt+1)/2;
if(check(mid))
lft=mid;
else
rgt=mid-1;
}
cout<<rgt;
return 0;
}

浙公网安备 33010602011771号