题目链接:1163
一个任务需要一个时间去做-.-所以第n天最多有n个任务-.-
每个任务都有一个结束时间-.-所以我们可以建一个优先队列
模拟选择-.-
从第一天开始--(所以可以将任务按时间排序)
每一个任务只能放进队列长度小于等于天数的。。
当队列中元素已满-再让这个任务的奖励与队列中最少的比较-.-看是否更换
具体代码:
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
int e,w;
}dian[50050];
bool cmp(node xx,node yy)
{
if (xx.e!=yy.e)
return xx.e<yy.e;
return xx.w>yy.w;
}
int main()
{
int n;scanf("%d",&n);
for (int i=0;i<n;i++)
scanf("%d%d",&dian[i].e,&dian[i].w);
sort(dian,dian+n,cmp);
priority_queue<int,vector<int >,greater<int> > que;
for (int i=0;i<n;i++)
{
if (que.size()<dian[i].e)
que.push(dian[i].w);
else
{
if (que.top()<dian[i].w)
{
que.pop();
que.push(dian[i].w);
}
}
}
long long s=0;
while (!que.empty())
{
s+=que.top();
que.pop();
}
printf("%lld\n",s);
return 0;
}