简单二分题。
二分的时候要注意边界一定要精确。像这题若设初值l=0就WA了。。。。
反正就是边界和check函数配合起来不能导致错误。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 100050 #define inf 0x7f7f7f7f7f7f7f7f using namespace std; long long n,k,x[maxn],ans1=-1,ans2=-1; long long check(long long lim) { long long now=0,ret=0; for (long long i=1;i<=n;i++) { now=max(now+x[i],0LL); if (now>=lim) {ret++;now=0;} } return ret; } int main() { scanf("%lld%lld",&n,&k); for (long long i=1;i<=n;i++) scanf("%lld",&x[i]); long long l=1,r=inf; while (l<=r) { long long mid=(l+r)>>1,ret=check(mid); if (ret==k) ans2=mid; if (ret<k) r=mid-1; else l=mid+1; } l=1;r=inf; while (l<=r) { long long mid=(l+r)>>1,ret=check(mid); if (ret==k) ans1=mid; if (ret<=k) r=mid-1; else l=mid+1; } if ((ans1==-1) || (ans2==-1)) printf("-1\n"); else printf("%lld %lld\n",ans1,ans2); return 0; }