zoukankan      html  css  js  c++  java
  • LibreOJ #2036. 「SHOI2015」自动刷题机

    #2036. 「SHOI2015」自动刷题机

    内存限制:256 MiB时间限制:1000 ms标准输入输出
    题目类型:传统评测方式:文本比较

    题目描述

    曾经发明了信号增幅仪的发明家 SHTSC 又公开了他的新发明:自动刷题机——一种可以自动 AC 题目的神秘装置。

    自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序。每秒,自动刷题机的代码生成模块会有两种可能的结果:

    1. 写了 xxx 行代码;
    2. 心情不好,删掉了之前写的 yyy 行代码。(如果 yyy 大于当前代码长度则相当于全部删除。)

    对于一个 OJ,存在某个固定的长度 n>0n>0n>0,一旦自动刷题机在某秒结束时积累了大于等于 nnn 行的代码,它就会自动提交并 AC 此题,然后新建一个文件(即弃置之前的所有代码)并开始写下一题。SHTSC 在某个 OJ 上跑了一天的自动刷题机,得到了很多条关于写代码的日志信息。他突然发现自己没有记录这个 OJ 的 nnn 究竟是多少。所幸他通过自己在 OJ 上的 Rank 知道了自动刷题机一共切了 kkk 道题,希望你计算 nnn 可能的最小值和最大值。

    输入格式

    第一行两个整数 l,kl, kl,k,表示刷题机的日志一共有 lll 行,一共了切了 kkk 题。
    第二行 lll 个整数 x1,,xl。xi≥0x_i geq 0xi​​0 表示写了 xix_ixi​​ 行代码,xi<0x_i < 0xi​​<0 表示删除了这道题的 −xi-x_ixi​​ 行代码。

    输出格式

    输出两个数 a,ba, ba,b,分别代表 nnn 可能的最小值和最大值。如果不存在这样的 nnn 则输出 −1-11。

    样例

    样例输入

    4 2
    2
    5
    -3
    9

    样例输出

    3 7

    样例解释

    如果 n=2n = 2n=2 那么刷题机就会切掉 333 题。但如果 n>7n > 7n>7 刷题机最多只能切 111 题。考虑 n=4n = 4n=4 时发生了什么。

    • 第一秒:刷题机写了 222 行。
    • 第二秒:刷题机又写了 555 行,共有 777 行,提交,自信 AC。
    • 第三秒:刷题机删掉了 333 行,共有 000 行。
    • 第四秒:刷题机写了 999 行,共有 999 行,提交,自信 AC。一共 AC 了两题。

    数据范围与提示

    对于 20%20\%20% 的数据,n≤10n leq 10n10;
    对于 40%40\%40% 的数据,n≤100n leq 100n100;
    对于 60%60\%60% 的数据,n≤2000n leq 2000n2000;
    对于 100%100\%100% 的数据,n≤100000n leq 100000n100000,−109≤xi≤109-10^9 leq x_i leq 10^9109​​xi​​109​​。

    /*
        两遍二分答案
    */
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    using namespace std;
    int a[100010],n,m;
    int check(long long it){
        int cnt=0;
        long long now=0;
        for(int i=1;i<=n;i++){
            now+=a[i];
            if(now>=it){
                now=0;
                cnt++;
            }
            if(now<0)now=0;
        }
        return cnt;
    }
    long long l,r,mx,ans1,ans2;
    int main(){
        //freopen("Cola.txt","r",stdin);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]),mx+=abs(a[i]);
        l=1;r=mx;
        while(l<=r){
            long long mid=(l+r)>>1;
            if(check(mid)<=m)r=mid-1,ans1=mid;
            else l=mid+1;
        }
        l=1;r=mx; 
        while(l<=r){
            long long mid=(l+r)>>1;
            if(check(mid)>=m)l=mid+1,ans2=mid;
            else r=mid-1;
        }
        if(check(ans1)!=m||check(ans2)!=m){
            printf("-1");return 0;
        }
        cout<<ans1<<' '<<ans2;
    }
  • 相关阅读:
    第十六节,基本数据类型,字典dict
    第十五节,基本数据类型,元组tuple
    第十四节,基本数据类型,列表list
    liunx rm 命令修改
    linux 创建用户和密码
    linux 权限
    system
    一个tomcat上部署多个项目,并通过不同端口号访问不同的项目
    Java 清理和垃圾回收
    static 方法
  • 原文地址:https://www.cnblogs.com/thmyl/p/7354859.html
Copyright © 2011-2022 走看看