【算法】二分查找
【题解】最小值最大化问题。
从1..l内二分枚举答案,将每个答案最少移开的石头数与最大移开数m比较。
精简写法学自:https://vijos.org/p/1981/solution(核糖核酸)
#include<cstdio> #include<algorithm> using namespace std; const int maxn=50010; int L,n,m,a[maxn]; int main() { scanf("%d%d%d",&L,&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); a[n+1]=L; int l=1,r=L; while(l<r) { int mid=(l+r)>>1; int now=0,pre=0; for(int i=1;i<=(n+1);i++) if(a[i]-a[pre]<mid)now++; else pre=i; if(now<=m)l=mid+1; else r=mid; } printf("%d",l-1); return 0; }