洛谷 P4343 [SHOI2015]自动刷题机
思路
二分答案
显然的二分答案,但是因为二分判定条件 \(\text{wa}\) 了好几遍……
可以发现,\(n\) 越大,\(k\) 就越小,所以答案是有单调性的,因此可以用两个二分,一次求最大值,一次求最小值,这里以求最大为例。
判定一个答案是否可行可以线性扫一遍直接求,在判定中记录过的题数 \(cnt\),由于 \(n\) 越大,\(k\) 就越小,所以:
- 如果 \(cnt=k\),更新最大值 \(maxn=mid\),并令 \(l=mid+1\),继续查找更大的值
- 如果 \(cnt<k\),说明 \(mid\) 右边的值都不可行,那么就将 \(r\) 左移,设为 \(r=mid-1\)
- 如果 \(cnt>k\),说明 \(mid\) 左边的值都不可行,那么就将 \(l\) 右移,设为 \(l=mid+1\)
这样最后找的的值就是最大值了,最小值同理。
注意:
- 记得开 \(\text{long long}\),否则会 \(\text{wa}\)
- 右端点要设置得足够大
- 在求出最大值之后可以直接将其作为求最小值时的二分右端点
代码
/*
Name: P4343 [SHOI2015]自动刷题机
Author: Loceaner
Date: 31/08/20 17:58
Description:
Debug: 二分判定条件出错
*/
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
const int A = 1e5 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 1e18;
inline int read() {
char c = getchar();
int x = 0, f = 1;
for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
int n, k, a[A], maxn = -inf, minn = inf, cnt, now;
inline bool check(int x) {
cnt = 0, now = 0;
for (int i = 1; i <= n; i++) {
now += a[i];
if (now < 0) now = 0;
if (now >= x) cnt++, now = 0;
}
return cnt == k;
}
signed main() {
n = read(), k = read();
for (int i = 1; i <= n; i++) a[i] = read();
int l = 0, r = inf;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) maxn = mid, l = mid + 1;
else if (cnt < k) r = mid - 1;
else if (cnt > k) l = mid + 1;
}
l = 1, r = maxn;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) minn = mid, r = mid - 1;
else if (cnt > k) l = mid + 1;
else if (cnt < k) r = mid - 1;
}
if (minn == inf || maxn == -inf) return cout << "-1\n", 0;
cout << minn << " " << maxn << '\n';
return 0;
}
洛谷 P4343 [SHOI2015]自动刷题机的更多相关文章
- 洛谷P4343 [SHOI2015]自动刷题机
题目 易得该题目中的\(n\)和\(k\)具有单调性,满足二分的性质,因此该题目而已用二分来枚举\(n\),然后对于每个\(n\)模拟出它所对应的\(k\),然后注意注意代码细节,并且当当前\(k\) ...
- luogu P4343 [SHOI2015]自动刷题机 |二分答案
题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开了他的新发明:自动刷题机--一种可以自动 AC 题目的神秘装置. 自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序. ...
- BZOJ_4590_[Shoi2015]自动刷题机_二分答案
BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...
- BZOJ4590 Shoi2015 自动刷题机 【二分】
BZOJ4590 Shoi2015 自动刷题机 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机–一种可以自动AC题目的神秘装置.自动刷题机刷题的方式非常简 ...
- 【BZOJ4590】[Shoi2015]自动刷题机 二分
[BZOJ4590][Shoi2015]自动刷题机 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动刷题机刷题的方式 ...
- bzoj4590: [Shoi2015]自动刷题机(二分答案)
4590: [Shoi2015]自动刷题机 题目:传送门 题解: 很明显的一道二分题. 对于二分性的判断:如果n越大,那么AC的题就越少,n越小,AC的题就越多,那么最大最小值都满足单调性,直接瞎搞. ...
- COGS2642 / Bzoj4590 [Shoi2015]自动刷题机
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 906 Solved: 321 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了 ...
- BZOJ4590: [Shoi2015]自动刷题机
显然看着就是二分,仔细看的话显然刷的题数随n增大单调不升. 挂了一发是因为无解输出一个-1而不是两个…… #include<cstdio> #include<algorithm> ...
- BZOJ4590——[Shoi2015]自动刷题机
1.题意:题意很简洁吧,就不概括了 2.分析:我思考了半天,我猜答案满足单调...没敢写,看了题解去问Claris为啥单调,Claris一句话" 因为n越大明显不可能做更多题 ", ...
随机推荐
- CF 633 div1 1338 B. Edge Weight Assignment 构造
LINK:Edge Weight Assignment 这场当时没打 看到这个B题吓到我了 还好当时没打. 想了20min才知道怎么做 而且还不能证明. 首先考虑求最小. 可以发现 如果任意两个叶子节 ...
- 探讨Netty获取并检查Websocket握手请求的两种方式
在使用Netty开发Websocket服务时,通常需要解析来自客户端请求的URL.Headers等等相关内容,并做相关检查或处理.本文将讨论两种实现方法. 方法一:基于HandshakeComplet ...
- idea安装testng插件后,无法使用调用testng里面的类
1.已经安装好idea的testng插件,并且应用上相关的两个插件. 2.已经导入maven仓库的testng.jar,并且重启过idea后:发现不能调用. 本人在百度很多相关资料,始终没有找到解决方 ...
- 【Canal】互联网背景下有哪些数据同步需求和解决方案?看完我知道了!!
写在前面 在当今互联网行业,尤其是现在分布式.微服务开发环境下,为了提高搜索效率,以及搜索的精准度,会大量使用Redis.Memcached等NoSQL数据库,也会使用大量的Solr.Elastics ...
- LeetCode 164. Maximum Gap[翻译]
164. Maximum Gap 164. 最大间隔 Given an unsorted array, find the maximum difference between the successi ...
- python文件的执行
python文件的后缀名没有限制,但是为了后来导入模版的规范性,python代码通常以".py"作为后缀: python文件运行 一般情况都是解释器+文件名,如:python ** ...
- ftp服务器的安装
vsftp的安装: 1.安装: yum -y install vsftpd 2.添加ftp用户: useradd ftpuser 3.给ftp用户添加密码: passwd ftpuser 输入两次密码 ...
- 11、Composite 组合模式 容器与内容的一致性(抽象化) 结构型设计模式
1.Composite模式定义 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这 ...
- Java基础—对象构造
1.重载 有些类有多个构造器.例如,可以如下构造一个空的StringBuilder对象: StringBuilder message = new StringBuilder(); 或者,可以指定一个初 ...
- css 命名规则 BEM!
随着CSS的发展,使用CSS有语义化的命名约定和CSS层的分离,将有助于它的可扩展性,性能的提高和代码的组织管理.著作权归作者所有. BEM本质应该是一个css命名方案,最流行的命名规则之一就是BEM ...