前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【题解】自动刷题机

【题解】自动刷题机

作者头像
MikeC
发布2022-09-21 14:55:25
1.1K0
发布2022-09-21 14:55:25
举报
文章被收录于专栏:MikeC's Blog

题目背景

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

题目描述

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

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

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

输入格式

第一行两个整数 l , k,表示刷题机的日志一共有 l 行,一共了切了 k 题。

接下来 l 行,每行一个整数 x_i,依次表示每条日志。若 x_i \geq 0,则表示写了 x_i 行代码,若 x_i \lt 0,则表示删除了 -x_i 行代码。

输出格式

输出一行两个整数,分别表示 n 可能的最小值和最大值。如果这样的 n 不存在,请输出一行一个整数 -1

输入输出样例

输入 #1

代码语言:javascript
复制
4 2
2
5
-3
9

输出 #1

代码语言:javascript
复制
3 7

说明、提示

  • 对于 20\% 的数据,保证 l \le 10
  • 对于 40\% 的数据,保证 l \le 100
  • 对于 60\% 的数据,保证l \le 2 \times 10^3
  • 对于 100\% 的数据,保证 1 \leq l \le 10^5-10^9 \le x_i \le 10^9

分析

显然这是一个“最小值最大“和"最大值最小"的问题,所以我们要通过二分来枚举 n 将得到的值与 k 比较判断是否成立,不成立则将右端向左,成立则将左端向右,使两个端点不断相互逼近最优解即可得到答案。

代码

代码语言:javascript
复制
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,x[100001],ans_1=-1,ans_2=-1;
int l,r,m;
int check(int a){
    int sum=0,cnt=0;
    for(int i=1;i<=n;i++){
        if(sum+x[i]<=0)sum=0;
        else sum+=x[i];
        if(sum>=a){
            sum=0;
            cnt++;
        }
    }
    return cnt;
}
signed main(){
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%lld",&x[i]);
    }
    l=1,r=1e17;
    while(l<=r){
        int mid=(l+r)/2;
        if(check(mid)<=k){
            r=mid-1;
            if(check(mid)==k){
                ans_1=mid;
            }
        }else l=mid+1;
    }
    l=1,r=1e17;
    while(l<=r){
        int mid=(l+r)/2;
        if(check(mid)>=k){
            l=mid+1;
            if(check(mid)==k){
                ans_2=mid;
            }
        }else r=mid-1;
    }
    if(ans_1==-1){
        printf("%lld",ans_1);
        return 0;
    }
    printf("%lld %lld",ans_1,ans_2);
    return 0;
}

最后修改:2021 年 07 月 05 日 09 : 11 PM

© 允许规范转载

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021 年 07 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目背景
  • 题目描述
  • 输入格式
  • 输出格式
  • 输入输出样例
    • 输入 #1
      • 输出 #1
      • 说明、提示
      • 分析
      • 代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档