题目链接:https://www.51nod.com/Challenge/Problem.html#!#problemId=1163
十分有意思的一道经典贪心
思路:我们按照结束时间来进行排序,如果当前时间大于用过的时间就将这个奖励加入其中,如果大于我们就将其中做过的最小的奖励替换掉(时间复杂度(o(nlogn)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//typedef __int128 bll;
typedef long double ld;
const ll maxn = 1e6 + 5;
const ll mod = 1e9 + 7;
struct node
{
ll x,y;
}a[maxn];
bool cmp(node a,node b)
{
return a.x < b.x;
}
priority_queue<ll,vector<ll>,greater<ll> > q;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll n,x;
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i].x >> a[i].y;
}
sort(a + 1, a + n + 1,cmp);
for(int i = 1; i <= n; i ++)
{
if(q.size() < a[i].x)q.push(a[i].y);
else
{
if(a[i].y > q.top())
{
q.pop();
q.push(a[i].y);
}
}
}
ll sum = 0;
while(!q.empty())
{
sum += q.top();
q.pop();
}
cout << sum << endl;
return 0;
}