题目链接

题目

题目描述

在一个游戏中,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的更多相关文章

  1. tokitsukaze and Soldier 来源:牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28886/1004 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K, ...

  2. codeforces Soldier and Number Game(dp+素数筛选)

    D. Soldier and Number Game time limit per test3 seconds memory limit per test256 megabytes inputstan ...

  3. 队列 Soldier and Cards

    Soldier and Cards 题目: Description Two bored soldiers are playing card war. Their card deck consists ...

  4. Soldier and Bananas

    Soldier and Bananas 题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=173141 题意: 给 ...

  5. CF Soldier and Cards (模拟)

    Soldier and Cards time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  6. CF Soldier and Badges (贪心)

    Soldier and Badges time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  7. HDU 5603 the soldier of love 离线+树状数组

    这是bestcorder 67 div1 的1003 当时不会做 看了赛后官方题解,然后翻译了一下就过了,而且速度很快,膜拜官方题解.. 附上官方题解: the soldier of love 我们注 ...

  8. 网络流(最大流) CodeForces 546E:Soldier and Traveling

    In the country there are n cities and m bidirectional roads between them. Each city has an army. Arm ...

  9. CodeForces 546 D. Soldier and Number Game(素数有关)

    Description Two soldiers are playing a game. At the beginning first of them chooses a positive integ ...

  10. 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 ...

随机推荐

  1. ClickHouse的Join算法

    ClickHouse的Join算法 ClickHouse是一款开源的列式分析型数据库(OLAP),专为需要超低延迟分析查询大量数据的场景而生.为了实现分析应用可能达到的最佳性能,分析型数据库(OLAP ...

  2. 基于java+springboot的求职招聘网站-求职招聘管理系统

    该系统是基于java+springboot开发的求职招聘网站.网上招聘管理系统.网上人才招聘系统.毕业生求职招聘系统.大学生求职招聘系统.校园招聘系统.企业招聘系统.是给师弟开发的毕业设计.大家学习过 ...

  3. 完美:C# Blazor中显示Markdown并添加代码高亮

    昨天发了一篇介绍这个库:C# Blazor中显示Markdown文件,介绍怎么在Blazor中显示Markdown内容的文章,文章内的代码是没有高亮的,思来相去,还是要做好,于是百度到这篇文章.NET ...

  4. 2023年江苏“领航杯”MISC一个很有意思的题目(别把鸡蛋放在同一个篮子里面)

    别把鸡蛋放在同一个篮子里面 题目附件:https://wwzl.lanzoue.com/i6HmX16finnc 1.题目信息 解压压缩包打开附件,获得5141个txt文档,每个文档都有内容,发现是b ...

  5. Qt5.9 UI设计(六)——TitleBar功能实现

    前言 上一章介绍了ControlTreeWidget 与ControlTabWidget联动的功能,这一章我们将实现自定义 TitleBar 的功能 操作步骤 修改按键图标最大和最小值 右键按键图标, ...

  6. Oracle19c on 银河麒麟的安装与升级

    Oracle19c on 银河麒麟的安装与升级 下载内容 preinstall CentOS8 https://yum.oracle.com/repo/OracleLinux/OL8/appstrea ...

  7. [转帖]TPC-C 、TPC-H和TPC-DS区别

    https://zhuanlan.zhihu.com/p/339886289 针对数据库不同的使用场景TPC组织发布了多项测试标准. TPC-C: TPC Benchmark C于1992年7月获得批 ...

  8. [转帖]Linux ps -o 查看进程启动时间

    https://www.cnblogs.com/apink/p/17572435.html 时间参数 如下表 参数  含义 start 显示进程启动时间的简短格式.通常,它会显示日期时间中的月-日 或 ...

  9. 【转帖】nginx变量使用方法详解-3

    https://www.diewufeiyang.com/post/577.html 也有一些内建变量是支持改写的,其中一个例子是 $args. 这个变量在读取时返回当前请求的 URL 参数串(即请求 ...

  10. 关于cockpit的学习

    关于cockpit的学习 背景 使用node-exporter 可以监控很多资源使用情况 但是这个需要搭建一套prometheus和grafana的工具 并且每个机器都需要安装一套node-expor ...