zoukankan      html  css  js  c++  java
  • BZOJ4590 自动刷题机

    Description

    曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置。自动
    刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序,每秒,自动刷题机的代码生成模
    块会有两种可能的结果:
    A.写了x行代码。
    B.心情不好,删掉了之前写的y行代码。(如果y大于当前代码长度则相当于全部删除。)
    对于每个OJ所有题目,存在某个固定的长度n>0。一旦自动刷题机在某秒结束时积累了大于等于n行的代码,它就会
    自动提交并AC此题,然后新建一个文件开始写下一题。SHTSC在某个OJ上跑了一天的自动刷题机,得到了很多条关
    于写代码的日志信息。他突然发现自己没有记录这个OJ的n究竟是多少。所幸他通过自己在OJ上的Rank知道了机一
    共切了k道题。希望你计算n可能的最小值和最大值。

     

    Input

    第一行两个整数l,k,表示刷题机的日志一共有l行,一共了切了k题。
    第二行l个整数,x1…xl。xi>=0表示写了xi行代码。xi<0表示删除了这道题的-xi行代码。
    1<=l,k<=100000,|xi|<=10^9

     

    Output

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

     

    Sample Input

    4 2
    2
    5
    -3
    9

    Sample Output

    3 7
    //样例1:如果n=2那么刷题机就会切掉3题。但如果n>7刷题机最多只能切1题。考虑n=4发生了什么。
    第一秒:刷题机写了2行。
    第二秒:刷题机又写了5行,共有7行,提交,自信AC。
    第三秒:刷题机删掉了3行,共有0行。
    第四秒:刷题机写了9行,共有9行,提交,自信AC。
    一共AC了两题。
     
     

    正解:二分答案
    解题报告:
      喜感的题目,我也想有自动刷题机。

      如果直接判断的话貌似不好做,然而只需要一个最大最小值,我们考虑转化成判定性问题
      二分答案,二分题目的长度,然后以两种方式更新答案就可以了。

     
     
     1 //It is made by jump~
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <ctime>
     9 #include <vector>
    10 #include <queue>
    11 #include <map>
    12 #include <set>
    13 #ifdef WIN32   
    14 #define OT "%I64d"
    15 #else
    16 #define OT "%lld"
    17 #endif
    18 using namespace std;
    19 typedef long long LL;
    20 const int MAXN = 100011;
    21 LL inf;
    22 LL ans1,ans2;
    23 int m,k;
    24 LL a[MAXN];
    25 LL l,r;
    26  
    27 inline int getint()
    28 {
    29        int w=0,q=0;
    30        char c=getchar();
    31        while((c<'0' || c>'9') && c!='-') c=getchar();
    32        if (c=='-')  q=1, c=getchar();
    33        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();
    34        return q ? -w : w;
    35 }
    36  
    37 inline LL getlong()
    38 {
    39        LL w=0,q=0;
    40        char c=getchar();
    41        while((c<'0' || c>'9') && c!='-') c=getchar();
    42        if (c=='-')  q=1, c=getchar();
    43        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();
    44        return q ? -w : w;
    45 }
    46  
    47 inline LL check(LL x){
    48     LL cnt=0;
    49     LL now=0;
    50     for(int i=1;i<=m;i++){
    51     if(a[i]+now>0) now+=a[i]; else now=0;
    52     if(now>=x){
    53         cnt++;
    54         now=0;//清零!!!
    55         //if(cnt>=k) return true;
    56     }
    57     }
    58     return cnt;
    59 }
    60  
    61 int main()
    62 {
    63   m=getint(); k=getint();
    64   inf=1; for(int i=1;i<=60;i++) inf*=2;
    65   for(int i=1;i<=m;i++) a[i]=getlong();
    66   l=1,r=inf;
    67   while(l<=r){
    68       LL mid=(l+r)>>1;
    69       if(check(mid)>k) l=mid+1,ans1=mid;
    70       else r=mid-1;
    71   }
    72  
    73   l=1,r=inf;
    74   while(l<=r) {
    75       LL mid=(l+r)>>1;
    76       if(check(mid)<k) r=mid-1,ans2=mid;
    77       else l=mid+1;
    78   }
    79   ans1++; ans2--;
    80   if(check(ans1)==k && check(ans2)==k) printf(OT" "OT,ans1,ans2);
    81   else printf("-1");
    82   return 0;
    83 }
  • 相关阅读:
    怎样使用Chrome模拟手机浏览器測试移动端网站
    [Erlang危机](5.1.3)进程
    Oracle ErrorStack 使用和阅读具体解释
    动态规划之整齐打印
    struts2+Oracle实现管理员查看用户提交的意见功能
    hdu 4956 Poor Hanamichi BestCoder Round #5(数学题)
    2014牡丹江——Known Notation
    诗云:静观天下
    QQ欢乐斗地主心得体会 (三):高倍场攻略
    QQ欢乐斗地主心得体会 (三):高倍场攻略
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/5538078.html
Copyright © 2011-2022 走看看