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 ...
随机推荐
- spring boot 集成配置阿里 Druid监控配置
本文为博主原创,转载请注明出处: github 地址如下:https://github.com/alibaba/druid/wiki 其相关问题也可参考:https://github.com/alib ...
- [转帖]TPC-C 、TPC-H和TPC-DS区别
https://zhuanlan.zhihu.com/p/339886289 针对数据库不同的使用场景TPC组织发布了多项测试标准. TPC-C: TPC Benchmark C于1992年7月获得批 ...
- [转帖]PolarDB和Oceanbase的区别和联系
PolarDB-X 和 OceanBase 都是阿里云提供的分布式关系型数据库产品,它们都具有高可用.高性能.分布式等特点.但是两者也存在一些差异. 数据库理论基础不同 PolarDB-X 基于传统的 ...
- [转帖]利用Python调用outlook自动发送邮件
↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 使用Python发送邮件有两种方式,一种是使用smtp调用邮箱的smtp服务器,另一种是直接调用程序直接发送邮件.而在outlo ...
- [转帖]浅谈RAID写惩罚(Write Penalty)与IOPS计算
https://www.dell.com/community/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E5%92%8C%E4%BF%9D%E6%8A%A4-%E8%B ...
- [转帖]公钥基础设施(PKI,Public Key Infrastructure)闲谈
https://zhuanlan.zhihu.com/p/384436119 背景 在现实空间中,人类的活动范围和接触人的范围有限,人和人最初的信任是建立在小团体或部落内部.随着全球化进展,人类的活动 ...
- [转帖]Native Memory Tracking 详解(4):使用 NMT 协助排查内存问题案例
https://www.modb.pro/db/557714 从前面几篇文章,我们了解了 NMT 的基础知识以及 NMT 追踪区域分析的相关内容,本篇文章将为大家介绍一下使用 NMT 协助排查内存问题 ...
- [转帖]使用 Crash 工具分析 Linux dump 文件
前言 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪.开发者认为,内核如果发生了错误,就不应该继续运行.因此内核发生错误时,它的行为通常被设 ...
- Stress-ng 的简单学习
背景 想研究一下国产和不同架构,不通型号CPU的算力 也作为后续生产交付的基线准备. 学习各种不同工具进行简要测试. 安装 git clone https://github.com/ColinIanK ...
- Linux部分参数的学习
Linux部分参数的学习 简介 之前总结过很多Nginx或者是部署软件时的一些注意事项. 但是感觉对linux系统参数部分掌握的不是很好. 今天周末想着整理一下,作为备忘. limits.conf i ...