[Shoi2015]自动刷题机

二分答案。二分n,然后check的时候发现分类讨论一下当前值与K的关系就行了。

论认真读题的重要性。我没看见直接新建一个文件,弃置之前???

难受

#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<<"\n";
    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;
}
自动刷题机

 

posted @ 2018-10-02 16:13  SWHsz  阅读(133)  评论(0编辑  收藏  举报