二分答案。二分n,然后check的时候发现分类讨论一下当前值与K的关系就行了。
论认真读题的重要性。我没看见直接新建一个文件,弃置之前???
难受
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=100005; long long l,k,a[N],L,R; long long ck(long long x) { long long tp=0,ans=0; for(int i=1;i<=l;i++) { if(a[i]-tp>=x) { ans++,tp=a[i]; } if(a[i]-tp<0) tp=a[i]; } // cout<<" "; return ans; } int main() { scanf("%lld%lld",&l,&k); R=0x3f3f3f3f3f3f3f3f; for(int i=1;i<=l;i++) scanf("%lld",&a[i]),a[i]+=a[i-1]; long long tmp=R,ans=-1; L=1; while(L<=R) { long long mid=L+R>>1; long long t=ck(mid); if(t<k) R=mid-1; else if(t==k)ans=mid,R=mid-1; else L=mid+1; } long long ansl=-1; if(ans!=-1) ansl=ans; ans=-1; L=1,R=tmp; while(L<=R) { long long mid=L+R>>1; long long t=ck(mid); if(t<k) R=mid-1; else if(t==k) ans=mid,L=mid+1; else L=mid+1; } if(ansl!=-1) printf("%lld %lld",ansl,ans); else puts("-1"); return 0; }