题目:
https://www.luogu.org/problemnew/show/3093
维护一个大根堆,每次取出堆顶元素,从当前时间往前扫,如果有时间没用过就用;
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
bool vis[10001];
struct hh { int tim,cost; }ma[10021];
priority_queue<hh>q;
bool operator < (hh a,hh b)
{
return a.cost<b.cost;
}
int ans=0,n;
void solve()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&ma[i].cost,&ma[i].tim),q.push(ma[i]);
while(!q.empty())
{
hh a=q.top();
q.pop();
if(vis[a.tim])
{
for(int i=a.tim-1;i>=1;i--)
if(!vis[i])
{
vis[i]=1,ans+=a.cost;
break;
}
}
else vis[a.tim]=1,ans+=a.cost;
}
cout<<ans;
}
int main()
{
solve();
return 0;
}