
NC50439 tokitsukaze and Soldier(贪心+优先队列)
发布日期:2021-05-08 15:19:02
浏览次数:23
分类:原创文章
本文共 912 字,大约阅读时间需要 3 分钟。
题目描述
在一个游戏中,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
思路:我们优先处理s比较大的,然后用优先队列维护,当s不够的时候,从优先队列里删去x比较小的那个。
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+1; priority_queue<ll,vector<ll>,greater<ll>>q;pair<ll,int>p[maxn];bool cmp(const pair<int,int>&a,const pair<int,int>&b){ return a.second>b.second;}int main(){ int n; ll sum=0,ans=0; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%lld %d",&p[i].first,&p[i].second); sort(p+1,p+1+n,cmp); for(int i=1;i<=n;++i) { while(q.size()>=p[i].second) { sum-=q.top(); q.pop(); } sum+=p[i].first; q.push(p[i].first); ans=max(ans,sum); } printf("%lld\n",ans);}
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年03月24日 09时10分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
2019-03-06
IDEA 调试Java代码的两个技巧
2019-03-06
Vue 数组和对象更新,但视图未更新,背后的故事
2019-03-06
剑指Offer面试题:9.二进制中1的个数
2019-03-06
《你是在做牛做马还是在做主管》- 读书笔记
2019-03-06
重新温习软件设计之路(4)
2019-03-06
MySQL数据库与python交互
2019-03-06
python如何对字符串进行html转义与反转义?
2019-03-06
开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程
2019-03-06
golang基础--类型与变量
2019-03-06
.NetCore外国一些高质量博客分享
2019-03-06
解决WebRTC中不同的浏览器之间适配的问题
2019-03-06
深入理解JavaScript函数
2019-03-06
【spring源码系列】之【xml解析】
2019-03-06
(在模仿中精进数据可视化07)星球研究所大坝分布可视化
2019-03-06
(数据科学学习手札02)Python与R在循环语句与条件语句上的异同
2019-03-06
(数据科学学习手札27)sklearn数据集分割方法汇总
2019-03-06
(数据科学学习手札40)tensorflow实现LSTM时间序列预测
2019-03-06