NC50439 tokitsukaze and Soldier
题目
题目描述
在一个游戏中,tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。
第i个士兵的战力为v[i],团的战力是团内所有士兵的战力之和。
但是这些士兵有特殊的要求:如果选了第i个士兵,这个士兵希望团的人数不超过s[i]。(如果不选第i个士兵,就没有这个限制。)
tokitsukaze想知道,团的战力最大为多少。
输入描述
第一行包含一个正整数 \(n(1≤n≤10^5)\) 。
接下来 \(n\) 行,每行包括 \(2\) 个正整数 \(v,s(1≤v≤10^9,1≤s≤n)\) 。
输出描述
输出一个正整数,表示团的最大战力。
示例1
输入
2
1 2
2 2
输出
3
示例2
输入
3
1 3
2 3
100 1
输出
100
题解
知识点:贪心,优先队列。
这是一道典型的后悔贪心。
根据经验,后悔贪心一般具有三个因素:限制,花费和收益,其中花费和收益必定有一个是常量。比如这道题花费就是常量每次加入一个人,人数作为花费只增加 \(1\) ;而有的题则是收益是常量,比如建筑抢修,收益是抢修建筑数量每次只增加 \(1\) 。背包问题同样也有这三个因素,但其不同的是,限制容积是个常量,但花费和收益都是变量,因此无法使用后悔贪心。但鄙人水平有限,具体无法证明,只是经验之谈。
后悔贪心总体思路:把对选项数量的限制从严到松开放,则可选项会逐渐增多,并且原先选中的扔掉不会影响限制。这里的可选人数的限制是人数限制,由人数限制的最小值决定,人数限制越小可选的人越多,故缩小人数限制。
一开始不会踢人,直到人数与最小值缩小到相等开始踢人。此时缩小最小值,可选的人数变多,并且原来选中的人的限制人数并不影响最小值。考虑加入新人后,踢出战斗力最小的直到满足人数限制,此时就是当前人数限制下的最优解,这里是维护动态数组有序性,用堆处理。有可能会踢掉刚刚加进来的,不影响后面过程,因为后面限制人数只会比现在更小。最后得到了所有人数情况下的最优解,答案取最大值即可。
时间复杂度 \(O(n \log n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct node {
int v, s;
}a[100007];
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 0;i < n;i++) {
cin >> a[i].v >> a[i].s;
}
sort(a, a + n, [&](node a, node b) {return a.s > b.s;});///按人数限制排序
///后悔贪心总体思路:把对选项数量的限制从严到松开放,则可选项会逐渐增多,并且原先选中的扔掉不会影响限制。
///这里的可选人数的限制是人数限制,由人数限制的最小值决定,人数限制越小可选的人越多,故缩小人数限制。
///一开始不会踢人,直到人数与最小值缩小到相等开始踢人。
///此时缩小最小值,可选的人数变多,并且原来选中的人的限制人数并不影响最小值。
///考虑加入新人后,踢出战斗力最小的直到满足人数限制,此时就是当前人数限制下的最优解。这里是维护动态数组有序性,用堆处理。
///有可能会踢掉刚刚加进来的,不影响后面过程,因为后面限制人数只会比现在更小。
///最后得到了所有人数情况下的最优解,答案取最大值即可。
priority_queue<int, vector<int>, greater<int>> pq;
ll ans = 0, sum = 0;
for (int i = 0;i < n;i++) {
pq.push(a[i].v);
sum += a[i].v;
while (pq.size() > a[i].s) sum -= pq.top(), pq.pop();
ans = max(ans, sum);
}
cout << ans << '\n';
return 0;
}
NC50439 tokitsukaze and Soldier的更多相关文章
- tokitsukaze and Soldier 来源:牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28886/1004 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K, ...
- codeforces Soldier and Number Game(dp+素数筛选)
D. Soldier and Number Game time limit per test3 seconds memory limit per test256 megabytes inputstan ...
- 队列 Soldier and Cards
Soldier and Cards 题目: Description Two bored soldiers are playing card war. Their card deck consists ...
- Soldier and Bananas
Soldier and Bananas 题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=173141 题意: 给 ...
- CF Soldier and Cards (模拟)
Soldier and Cards time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- CF Soldier and Badges (贪心)
Soldier and Badges time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- HDU 5603 the soldier of love 离线+树状数组
这是bestcorder 67 div1 的1003 当时不会做 看了赛后官方题解,然后翻译了一下就过了,而且速度很快,膜拜官方题解.. 附上官方题解: the soldier of love 我们注 ...
- 网络流(最大流) CodeForces 546E:Soldier and Traveling
In the country there are n cities and m bidirectional roads between them. Each city has an army. Arm ...
- CodeForces 546 D. Soldier and Number Game(素数有关)
Description Two soldiers are playing a game. At the beginning first of them chooses a positive integ ...
- Codeforces Round #304 (Div. 2) E. Soldier and Traveling 最大流
题目链接: http://codeforces.com/problemset/problem/546/E E. Soldier and Traveling time limit per test1 s ...
随机推荐
- C# WPF 简单自定义菜单切换动画
微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏 C# WPF 简单自定义菜单切换动画 内容目录 实现效果 业务场景 编码实现 ...
- Go-值传递&引用传递
值类型和引用类型 值类型关注其值 引用类型关注其指针 值类型和引用类型区别在于传递值的时候拷贝的对象不同,值传递拷贝是变量的值,引用传递拷贝的是变量的指针 拷贝 -- 传递值 赋值 函数调用 初始化 ...
- [转帖]SMEMBERS:获取集合包含的所有元素
https://www.bookstack.cn/read/redisguide/spilt.4.291fab46a3b4f05c.md SMEMBERS set 以下代码展示了如何使用 SMEMBE ...
- [转帖]linux 批量修改文件格式
将Windows上的shell脚本拷贝到Linux时,脚本的编码格式还是docs,需要改成unix才可执行,在文件不多的情况下可以直接手动更改,但是在脚本文件比较多的时候,手动改起来就太麻烦了,此时就 ...
- [转帖]Systemd 指令
一.由来 历史上,Linux 的启动一直采用init进程. 下面的命令用来启动服务. $ sudo /etc/init.d/apache2 start # 或者 $ service apache2 s ...
- [转帖]Nginx动静分离详解以及配置
https://developer.aliyun.com/article/885602?spm=a2c6h.24874632.expert-profile.314.7c46cfe9h5DxWK 简介: ...
- [转帖]使用 Shell 运算进行进制转换 16进制转10进制
使用 Shell 运算进行进制转换 工作时候常常遇到一些问题,拿到的数字是16进制的,但是运算的时候是10进制的,shell可以很方便的处理这类的进制转换问题,一种情况是使用 Shell 运算把一个数 ...
- vue render函数的简单使用(1)
1.render函数的介绍 在vue中我们经常使用HTML模板语法来组建页面. 除此之外,使用还可以使用render函数来创建页面. 因为vue是虚拟DOM,拿到template模板时也要转译成VNo ...
- 【笔记】学到几个 golang 代码小技巧
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 从这篇文章学到:10个令人惊叹的Go语言技巧,让你的代码更 ...
- vm-storage在全部都是新metric情况下的写入性能测试
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 vm-storage中,写入索引的性能要比写入data p ...