题目:https://www.luogu.org/problemnew/show/P2678
二分答案。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define mid ((l+r)>>1) using namespace std; int const maxn=50005; int n,m,L,d[maxn],a[maxn],ans; int ck(int x) { int ret=0;//留下石头数 for(int i=1,tmp=0;i<=n;i++) { if(tmp+a[i]>=x)ret++,tmp=0; else tmp+=a[i]; } //tmp 有剩余则并到前一个区间,留下石头数不变 return n-ret; } int main() { scanf("%d%d%d",&L,&n,&m); for(int i=1;i<=n;i++)scanf("%d",&d[i]),a[i]=d[i]-d[i-1]; a[++n]=L-d[n-1]; int l=0,r=L; while(l<=r) { if(ck(mid)<=m)ans=mid,l=mid+1; else r=mid-1; } printf("%d\n",ans); return 0; }