*【UESTC】优先队列

来源:互联网 发布:js获取系统时间 编辑:程序博客网 时间:2024/06/05 11:42

最近郭大侠迷上了玩Rabi-Ribi这个游戏。

Rabi-Ribi呢,是一个打兔子的动作冒险游戏,萌萌哒的兔子在地上跑来跑去,好萌好萌呀~

这个游戏是这样玩的,郭大侠作为一个主角,拿着一个小锤子,他的目标是敲晕兔子,然后最后把这些敲晕的兔子都带回家。

当然咯,郭大侠想带回的兔子的总价值最高~

但是,兔子实在是太多了,郭大侠的锤子每一秒钟只能敲晕一只兔子,而且每一只兔子只会在地面上逗留a[i]a[i]秒,在a[i]a[i]秒之后,这一只兔子就会跑回自己的小窝里面。

所以郭大侠面临一些抉择,希望你能帮助他。

Input

第一行包含一个整数NN表示有NN个兔子在地上跑来跑去。

第二行NN个用空格分隔的整数a[i]a[i]表示第i只兔子冒出后停留的时间

第三行NN个用空格分隔的整数v[i]v[i]表示第i只兔子的价值。

1N1000001≤N≤100000

1a[i]50001≤a[i]≤5000

1v[i]10001≤v[i]≤1000

Output

输出郭大侠最多能获得的价值是多少

Sample Input
55 3 6 1 47 9 2 1 5
31 1 11 2 3
Sample Output
24
3
Hint

死宅真可怕,连可爱的兔子都要敲晕带回家 QAQ

code:

#include<cstdio>#include<queue>#include<algorithm>using namespace std;#include<cstring>struct Node{int a,v;bool operator <(Node x)const{return v>x.v;}}tu[100001];bool cmp(Node x,Node y){return x.a<y.a;}int main(){int n;while(~scanf("%d",&n)){for(int i=0;i<n;i++)scanf("%d",&tu[i].a);for(int i=0;i<n;i++)scanf("%d",&tu[i].v);sort(tu,tu+n,cmp);priority_queue<Node>q;int time=0;long long sum=0;q.push(tu[0]);++time,sum+=tu[0].v;for(int i=1;i<n;i++){if(tu[i].a<=time&&tu[i].v>q.top().v){//下一个时间短,但价值比前一个大,则舍弃前一个sum-=q.top().v;sum+=tu[i].v;q.pop();q.push(tu[i]); }else if(tu[i].a>time){//时间足够,直接放进去 q.push(tu[i]);sum+=tu[i].v;++time; }}printf("%lld\n",sum);}return 0; } 

0 0