luoguP4343自动刷题机(二分标准题)
https://www.luogu.org/problem/P4343
参考博客:https://www.luogu.org/blog/ofnoname/solution-p4343
这真是一语点醒梦中人啊! 其实我们只需要掌握好一种二分答案的正确写法就行了,不用非要是标准的(看不懂没关系, 说给自己听的)
以下为那位博主的分析,我觉得特别好
容易发现,对于给定的序列,n越大能过的题是越少的,所以可以二分来求刚好过k道题的左右边界。
若mid大于k,即做得太多了,就将l右移。
若mid小于k,即做得太少了,就将r左移。
求左边界,需要在mid等于k时将r左移,求右边界时则需将l右移。这个很好理解。
(这就是我们在哪写ans = mid的依据了)
印象里二分写法极多,但现在普遍应用 l<=r, l=mid+1, r=mid-1
这个版本了,虽然要多记录一个ans
,但是却在单调增单调减时都能工作,并且可以轻松应对无解的情况。
注意这种写法l应设为1,r设为无穷大即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int k, l;
long long a[100000+9];
long long check(long long n) {
long long sum = 0, num = 0;
for(int i = 1; i <= l; i++) {
sum += a[i];
sum = max(sum, (long long)0);
if(sum >= n) {num++, sum = 0;}
}
return num;
}
int main() {
scanf("%d%d",&l, &k);
for(int i = 1; i <= l; i++) scanf("%lld", &a[i]);
long long l = 1, r = 1e18, mid, mn = -1, mx = -1;// l 设为1, r为INF(真正的INF
while(l <= r) {
mid = (l+r)>>1;
if(check(mid) <= k) {
r = mid - 1;
if(check(mid) == k) mn = mid;//找最小值->需要在合法的时候把r左移,所以在更新r的地方写‘=’
} else l = mid + 1;
}
l = 1, r = 1e18;
while(l <= r) {
mid = (l+r)>>1;
if(check(mid) >= k) {
l = mid + 1;
if(check(mid) == k) mx = mid;//找最大值->需要在合法的时候把l右移, 所以... **让mx越来越大**
}else r = mid - 1;
}
if(mn == -1) printf("-1");//判断不合法情况
else printf("%lld %lld", mn, mx);
}
luoguP4343自动刷题机(二分标准题)的更多相关文章
- 【BZOJ-4590】自动刷题机 二分 + 判定
4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 156 Solved: 63[Submit][Status ...
- 【BZOJ4590】[Shoi2015]自动刷题机 二分
[BZOJ4590][Shoi2015]自动刷题机 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动刷题机刷题的方式 ...
- bzoj4590: [Shoi2015]自动刷题机(二分答案)
4590: [Shoi2015]自动刷题机 题目:传送门 题解: 很明显的一道二分题. 对于二分性的判断:如果n越大,那么AC的题就越少,n越小,AC的题就越多,那么最大最小值都满足单调性,直接瞎搞. ...
- luogu P4343 [SHOI2015]自动刷题机 |二分答案
题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开了他的新发明:自动刷题机--一种可以自动 AC 题目的神秘装置. 自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序. ...
- BZOJ 4590 [Shoi2015]自动刷题机 ——二分答案
二分答案水题. #include <cstdio> #include <cstring> #include <iostream> #include <algo ...
- BZOJ_4590_[Shoi2015]自动刷题机_二分答案
BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...
- BZOJ4590 Shoi2015 自动刷题机 【二分】
BZOJ4590 Shoi2015 自动刷题机 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机–一种可以自动AC题目的神秘装置.自动刷题机刷题的方式非常简 ...
- LibreOJ #2036. 「SHOI2015」自动刷题机
#2036. 「SHOI2015」自动刷题机 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开 ...
- BZOJ4590 自动刷题机
Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...
随机推荐
- Druid-代码段-1-3
所属文章:池化技术(一)Druid是如何管理数据库连接的? 本代码段对应流程1.2,真正获取连接的执行: private DruidPooledConnection getConnectionInte ...
- MATLAB聚类有效性评价指标(外部)
MATLAB聚类有效性评价指标(外部) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多内容,请看:MATLAB.聚类.MATLAB聚类有效性评价指 ...
- java8-02-再探Lambda表达式
Lambda表达式 主要作用替代匿名内部类 达到简化代码的操作 Lambda表达式 在对象中的使用 Employee类
- dom0、dom2、dom3事件
https://www.jianshu.com/p/3acdf5f71d5b addEventListener():可以为元素添加多个事件处理程序,触发时会按照添加顺序依次调用. removeEven ...
- P4762 [CERC2014]Virus synthesis
题意 真是道回文自动机好题. 首先考虑答案必定是一个回文串+剩余部分的形式,因此可以建出回文自动机,之后考虑每个长度为偶数的回文串. 对于一个长度为偶数的回文串,设它在回文自动机上对应的节点为\(x\ ...
- TensorFlow中实现RNN,彻底弄懂time_step
这篇博客不是一篇讲解原理的博客,这篇博客主要讲解tnesorlfow的RNN代码结构,通过代码来学习RNN,以及讲解time_steps,如果这篇博客没有让你明白time_steps,欢迎博客下面评论 ...
- Laravel配置全局公共函数
在Laravel项目中我们常常需要定义一些全局的公共函数,通常我们会将这些公共函数定义在一个单独的文件里,如helpers.php中.我们在app目录下创建一个名为helpers.php的文件(app ...
- SQL Server内部如何管理对象的数据Page?
一个表或Index使用的数据页空间是由IAM Page Chain来管理的.SQL Server 使用一个IAM(Index Allocation Map)Page来管理数据库文件中最多4GB的空间, ...
- 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体
在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage(); ...
- windows server 2008 r2 安装 vs2017 无法进入安装界面问题解决方法
在 windows server 2008 r2 版本操作系统上安装 vs2017 经常出现下载进度条结束后没有任何反应问题,一般是因为安装程序兼容性造成的,解决方案如下: 将 C:\Program ...