NC13885 Music Problem
题目
题目描述
Listening to the music is relax, but for obsessive(强迫症), it may be unbearable.
HH is an obsessive, he only start to listen to music at 12:00:00, and he will never stop unless the song he is listening ends at integral points (both minute and second are 0 ), that is, he can stop listen at 13:00:00 or 14:00:00,but he can't stop at 13:01:03 or 13:01:00, since 13:01:03 and 13:01:00 are not an integer hour time.
Now give you the length of some songs, tell HH whether it's possible to choose some songs so he can stop listen at an integral point, or tell him it's impossible.
Every song can be chosen at most once.
输入描述
The first line contains an positive integer \(T(1≤T≤60)\) , represents there are \(T\) test cases.
For each test case:
The first line contains an integer \(n(1≤n≤10^5)\) , indicating there are \(n\) songs.
The second line contains \(n\) integers \(a_1,a_2…a_n (1≤a_i≤10^9 )\) , the ith integer \(a_i\) indicates the ith song lasts \(a_i\) seconds.
输出描述
For each test case, output one line "YES" (without quotes) if HH is possible to stop listen at an integral point, and "NO" (without quotes) otherwise.
示例1
输入
3
3
2000 1000 3000
3
2000 3000 1600
2
5400 1800
输出
NO
YES
YES
说明
In the first example it's impossible to stop at an integral point.
In the second example if we choose the first and the third songs, they cost 3600 seconds in total, so HH can stop at 13:00:00
In the third example if we choose the first and the second songs, they cost 7200 seconds in total, so HH can stop at 14:00:00
题解
方法一
知识点:背包dp。
此题01背包很好做但不优化会超时。
首先设置状态 \(dp[i][j]\) 为考虑了 \(i\) 首,时长模 \(3600\) 的余数为 \(j\) 的情况是否存在。模的操作是一个很关键的操作,优化了算法并最大化信息有效率,因为我们知道余数就可以知道是否整点了。
注意因为成功条件就是余数为 \(0\) ,我们不能一开始给 \(0\) 初值为 \(1\) ,但后果是某首自己的时间没法直接进入,因为无法从 \(0\) 转移,因此要特判。
但这样还不能过,需要有个跳出条件,显然 \(dp[i][0] = 1\) 时可以直接跳出。
还有个优化,但这里可以不需要,\(n\geq3600\) 时一定能成功,因为有根据抽屉原理,此时存在两个不同端点的时间余数前缀和是相同的,于是以这两个端点的连续区间和是 \(3600\) 的倍数,即余数为 \(0\) 。
最终还能滚动数组优化空间。
时间复杂度 \(O(n)\)
空间复杂度 \(O(1)\)
方法二
知识点:背包dp,STL。
由于是一个 01背包中的01类型,因此可以 bitset 常数优化。写起来也简单。
时间复杂度 \(O(n)\)
空间复杂度 \(O(1)\)
代码
方法一
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool dp[2][3607];
int a[100007];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i], a[i] %= 3600;
if (n >= 3600) return true;///必然能得到连续的和为3600倍数的(这道题没这个特判也行)
memset(dp, 0, sizeof(dp));
for (int i = 1;i <= n;i++) {
dp[i & 1][a[i]] = 1;///由于j=0保留为0,所以从j=0传递特判
for (int j = 0;j <= 3599;j++) {
dp[i & 1][j] |= dp[i + 1 & 1][j] | dp[i + 1 & 1][(j - a[i] + 3600) % 3600];
}
if (dp[i & 1][0]) return true;///优化
}
return false;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << "NO" << '\n';
else cout << "YES" << '\n';
}
return 0;
}
方法二
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[100007];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i], a[i] %= 3600;
if (n >= 3600) return true;///必然能得到连续的和为3600倍数的(这道题没这个特判也行)
bitset<3607> dp;
for (int i = 1;i <= n;i++) {
dp |= dp << a[i] | dp >> (3600 - a[i]);///多出去那部分也要
dp[a[i]] = 1;///单独考虑
}
return dp[0];
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << "NO" << '\n';
else cout << "YES" << '\n';
}
return 0;
NC13885 Music Problem的更多相关文章
- 1199 Problem B: 大小关系
求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...
- No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.
Gson解析JSON字符串时出现了下面的错误: No-args constructor for class X does not exist. Register an InstanceCreator ...
- C - NP-Hard Problem(二分图判定-染色法)
C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144 ...
- Time Consume Problem
I joined the NodeJS online Course three weeks ago, but now I'm late about 2 weeks. I pay the codesch ...
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- hdu1032 Train Problem II (卡特兰数)
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
- [LeetCode] Water and Jug Problem 水罐问题
You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...
- [LeetCode] The Skyline Problem 天际线问题
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- PHP curl报错“Problem (2) in the Chunked-Encoded data”解决方案
$s = curl_init(); curl_setopt($s, CURLOPT_POST, true); curl_setopt($s, CURLOPT_POSTFIELDS, $queryStr ...
随机推荐
- springboot启动流程 (3) 自动装配
在SpringBoot中,EnableAutoConfiguration注解用于开启自动装配功能. 本文将详细分析该注解的工作流程. EnableAutoConfiguration注解 启用Sprin ...
- js - 元素 scrollTop 设置无效的原因 及 解决办法
原因 : 元素 display : flex ; 解决方法 : display : block;
- Redis-主从复制-哨兵模式
- Redis-逻辑库-select
- 如何看待《李跳跳》APP因被腾讯公司发律师函称“不正当竞争”而无限期停止更新?
一波未平一波又起,继李跳跳无限期停更后,又一安卓神奇工具被下发律师函!近期各路安卓工具APP,被某讯大厂可谓是尽数剿灭~ 不难看出此次行动是"蓄谋已久"了.与李跳跳.大圣净化类似的 ...
- 关于decimal非常浅显的学习与整理
关于decimal非常浅显的学习与整理 背景知识 整数,小数,浮点,定点 整数(Integer)是没有小数部分的数值,可以是正数.负数或零.在计算机中,整数通常以二进制形式存储. 小数(Decimal ...
- [转帖]【Kafka】(二)Kafka去Zookeeper化,kraft模式搭建
1.简介 由于zookeeper慢慢的成了kafka的瓶颈,kafka提出了去zookeeper化的概念,并在2.8版本之后版本都包含了kraft模式,也就是不需要使用zookeeper了,目前这种模 ...
- [转帖]xsos:一个在 Linux 上阅读 SOSReport 的工具
https://www.sohu.com/a/315931829_100034897 xsos 是一个帮助用户轻松读取 Linux 系统上的 sosreport 的工具.另一方面,我们可以说它是 so ...
- [转帖]淫技巧 | 如何查看已连接的wifi密码
https://blog.csdn.net/DynmicResource/article/details/120134984?spm=1001.2014.3001.5502 主题使用方法:https: ...
- [转帖]gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化
相关博客http://blog.chinaunix.net/uid-24954950-id-2956476.html 相关博客http://blog.csdn.net/misiter/article/ ...