每日一题(3月25日tokitsukaze and Soldier 优先队列,贪心)
tokitsukaze and Soldier
https://ac.nowcoder.com/acm/problem/50439
题意:给你N个士兵。每个人的武力值为v,可组队人数为S,求怎么组队武力值最大。
思路:从组队人数N-1开始,每次吧组队人数>=N的人的武力值加入,并用小顶堆维护人数的同时保证武力值最大。
#include <iostream> #include <algorithm> #include <cmath> #include <ctype.h> #include <cstring> #include <cstdio> #include <set> #include <sstream> #include<string> #include<queue> #include<stack> #include<map> #include<vector> #define MAXX 100005 #define SIS std::ios::sync_with_stdio(false) #define ll long long #define INF 0x3f3f3f3f //#include<bits/stdc++.h> using namespace std; const int MAX =1e6+5; const int mod=998244353; vector<ll> vt[100005]; priority_queue<ll,vector<ll>,greater<ll> >q; int main() { SIS; int n; cin>>n; for(int i=0;i<n;i++) { int v,s; cin>>v>>s; vt[s].push_back(v); } ll ans=0,sum=0; for(int i=n;i>=1;i--) { for(auto u:vt[i]){ sum+=u; q.push(u); } while(q.size()>i) { sum-=q.top(); q.pop(); } ans=max(sum,ans); } cout<<ans<<endl; return 0; }