0
点赞
收藏
分享

微信扫一扫

牛客算法周周练10 E-跳石头(二分)

sunflower821 2022-09-26 阅读 106

地址:​​https://ac.nowcoder.com/acm/contest/5986/E​​

解析:

二分最短距离,check出它所需要的修改次数。

check里注意,如果需要修改,那么last是不要变的,因为往后的a[i]-last即为去掉中间后的距离。

如果不需要修改,那么last需要变为a[i],因为a[i]之前的石头都已被搬掉,last只能变成a[i]了。

#include <cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int l,n,m;
int a[maxn];
bool check(int x)
{
int last=0,cnt=0;
for(int i=1;i<=n+1;i++)
{
if(a[i]-last<x)
cnt++;
else
last=a[i];
}
if(cnt>m)
return false;
return true;
}
int main()
{
cin>>l>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
a[n+1]=l;
int ll=0,rr=l,x;
while(ll<rr)
{
int md=(ll+rr+1)>>1;
if(check(md))
{
// x=md;
ll=md;
}
else
rr=md-1;
}
cout<<rr<<endl;

}

 



举报

相关推荐

0 条评论