题意:
共
有
n
种
物
品
,
每
种
物
品
有
两
种
属
性
共有n种物品,每种物品有两种属性
共有n种物品,每种物品有两种属性
价
值
p
i
和
过
期
时
间
d
i
价值p_i和过期时间d_i
价值pi和过期时间di
到
了
过
期
时
间
以
后
就
不
能
再
买
了
到了过期时间以后就不能再买了
到了过期时间以后就不能再买了
问
最
大
能
获
得
多
少
价
值
问最大能获得多少价值
问最大能获得多少价值
题解:
最
大
价
值
中
的
物
品
肯
定
要
保
证
在
都
不
超
过
截
止
日
期
最大价值中的物品肯定要保证在都不超过截止日期
最大价值中的物品肯定要保证在都不超过截止日期
所
以
要
先
对
过
期
时
间
进
行
排
序
所以要先对过期时间进行排序
所以要先对过期时间进行排序
排
序
后
依
次
把
物
品
的
价
值
放
入
优
先
队
列
排序后依次把物品的价值放入优先队列
排序后依次把物品的价值放入优先队列
如
果
队
内
物
品
数
量
大
于
当
前
物
品
截
止
时
间
如果队内物品数量大于当前物品截止时间
如果队内物品数量大于当前物品截止时间
也
就
是
说
明
已
经
卖
出
的
时
间
导
致
这
个
物
品
过
期
了
也就是说明已经卖出的时间导致这个物品过期了
也就是说明已经卖出的时间导致这个物品过期了
但
是
使
用
了
优
先
队
列
,
就
可
以
得
到
反
悔
的
机
会
但是使用了优先队列,就可以得到反悔的机会
但是使用了优先队列,就可以得到反悔的机会
如
果
发
现
前
面
有
物
品
的
价
值
比
他
还
小
,
说
明
可
以
用
该
物
品
替
换
如果发现前面有物品的价值比他还小,说明可以用该物品替换
如果发现前面有物品的价值比他还小,说明可以用该物品替换
由
于
前
面
的
截
止
时
间
比
这
个
物
品
还
要
短
由于前面的截止时间比这个物品还要短
由于前面的截止时间比这个物品还要短
那
么
一
定
可
以
将
当
前
物
品
放
入
优
先
队
列
那么一定可以将当前物品放入优先队列
那么一定可以将当前物品放入优先队列
最
后
统
计
一
下
优
先
队
列
中
的
所
有
值
即
可
最后统计一下优先队列中的所有值即可
最后统计一下优先队列中的所有值即可
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double,double> pdd;
//const int mod=1e9+7;
const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
struct node{
int p,d;
}p[10010];
bool cmp(node a,node b){
return a.d<b.d;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
while(cin>>n){
for(int i=1;i<=n;i++)cin>>p[i].p>>p[i].d;
sort(p+1,p+1+n,cmp);
priority_queue<int,vector<int>,greater<int> > q;
ll ans=0;
for(int i=1;i<=n;i++){
q.push(p[i].p);
if(SZ(q)>p[i].d)q.pop();
}
while(SZ(q))ans+=q.top(),q.pop();
cout<<ans<<endl;
}
return 0;
}