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;
} 

猜你喜欢

转载自www.cnblogs.com/QYJ060604/p/11568181.html