P7874 「SWTR-07」My rating is -32
2021/9/22 23:11:54
本文主要是介绍P7874 「SWTR-07」My rating is -32,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1 P7874 「SWTR-07」My rating is -32
- 题目链接:https://www.luogu.com.cn/problem/P7874
2 题目描述
时间限制 \(200ms\) | 空间限制 \(16MB\)
将 \(1\sim n\) 不重不漏地分进 \(k\) 个集合 \(S_1,S_2,\cdots,S_k\) 中,满足相邻的数不在同一集合且 \(|S_i|>0\) 。求
\(\sum_{i=1}^k a[{\min_{j\in S_i}j}]\)
的最大值,其中 \([]\) 表示下标。
数据范围:
对于 \(100\%\) 的数据,\(2 \leq k \leq n \leq 10^4\),\(0 \leq a_i \leq 10^9\),\(T=10\)。
3 题解
考虑贪心。
容易发现,如果没有相邻的条件,答案就是第一个数加上剩下的前 \(k - 1\) 大数的和。
这是因为我们可以先将所有的数放到一个集合里,然后将前 \(k - 1\) 大的数放到剩余的 \(k - 1\) 个集合中,此时由于这些集合都只有一个元素,所以取得的值就是那个元素。
考虑相邻的条件。容易发现此时我们可以将所有的下标按照奇偶分类,分别放入前两个集合中,然后再从这两个集合中取出剩余的前 \(k- 2\) 大的数。
所以答案就是前两个数加上剩余数中前 \(k - 2\) 的数的和,用优先队列维护即可。
时间复杂度为 \(O(n\log_2n)\),可以通过本题。
4 代码(空格警告):
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <map> #include <cstdlib> #include <cmath> using namespace std; const int N = 1e4 + 10; #define int long long int read() { int x = 0, f = 1; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); } while (c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); } return x * f; } int T, n, k, ans, cnt; int a[N]; signed main() { T = read(), T = read(); while (T--) { cnt = 0; priority_queue<int> q; n = read(), k = read(); for (int i = 1; i <= n; i++) a[i] = read(); ans = a[1] + a[2]; for (int i = 3; i <= n; i++) q.push(a[i]); k -= 2; while (q.size() && cnt < k) { int x = q.top(); q.pop(); ans += x; cnt++; } printf("%lld\n", ans); } return 0; }
欢迎关注
这篇关于P7874 「SWTR-07」My rating is -32的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26手写消息中间件:从零开始的指南
- 2024-11-26Java语音识别项目资料:新手入门教程
- 2024-11-26JAVA语音识别项目资料:新手入门教程
- 2024-11-26Java语音识别项目资料:入门与实践指南
- 2024-11-26Java云原生资料入门教程
- 2024-11-26Java云原生资料入门教程
- 2024-11-26Java云原生资料:新手入门教程
- 2024-11-25Java创意资料:新手入门的创意学习指南
- 2024-11-25JAVA对接阿里云智能语音服务资料详解:新手入门指南
- 2024-11-25Java对接阿里云智能语音服务资料详解