地址: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; }