P4343 [SHOI2015]自动刷题机
P4343 [SHOI2015]自动刷题机
明显二分答案
然后对于一个mid直接按照题意模拟一下
如果cnt==k那么ans=x,只记录相等的答案
最后记得:-1只输出一个!
代码:
#include<bits/stdc++.h> using namespace std; const int N=100005; typedef long long ll; int n,k; ll a[N]; ll l,r,ans; inline bool check1(ll x){ int cnt=0; ll sum=0; for(int i=1;i<=n;i++){ sum+=a[i]; if(sum>=x){ sum=0; cnt++; } if(sum<0) sum=0; }//gcout<<x<<" LL "<<cnt<<endl; //cout<<cnt<<" "<<x<<endl; if(cnt==k) ans=x; return cnt>=k?1:0; } inline bool check2(ll x){ int cnt=0; ll sum=0; for(int i=1;i<=n;i++){ sum+=a[i]; if(sum>=x){ sum=0; cnt++; } if(sum<0) sum=0; } if(cnt==k) ans=x; //cout<<cnt<<endl; return cnt<=k; } int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } l=1ll,r=2388780192198ll,ans=-1ll; while(l<=r){ //cout<<l<<" "<<r<<endl; ll mid=(l+r)/2ll; if(check2(mid)) r=mid-1ll; else l=mid+1ll; } printf("%lld ",ans); if(ans==-1) return 0; l=1ll,r=2388780192198ll,ans=-1ll; while(l<=r){ //cout<<l<<" "<<r<<endl; ll mid=(l+r)/2ll; if(check1(mid)) l=mid+1ll; else r=mid-1ll; } printf("%lld\n",ans); return 0; }