题意:给你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;
}

京公网安备 11010502036488号