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);}
上一篇:NC15553 数学考试(线性DP)
下一篇:Codeforces Round #257 (Div. 1) B. Jzzhu and Cities(多条最短路)

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年03月24日 09时10分22秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章