地址:http://acm.uestc.edu.cn/#/problem/show/1334
题目:
郭大侠与Rabi-Ribi
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
最近郭大侠迷上了玩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只兔子的价值。
1≤N≤1000001≤N≤100000
1≤a[i]≤50001≤a[i]≤5000
1≤v[i]≤10001≤v[i]≤1000
Output
输出郭大侠最多能获得的价值是多少
Sample input and output
Sample Input | Sample Output |
---|---|
5 5 3 6 1 4 7 9 2 1 5 |
24 |
3 1 1 1 1 2 3 |
3 |
Hint
死宅真可怕,连可爱的兔子都要敲晕带回家 QAQ
思路:
。。大侠好残忍,兔子都打
正如卿学姐所说倒着打就好了,把兔子消失的时间记为兔子出现的时间,然后倒着打兔子
用一个优先队列来维护兔子,每次打权重最大的,每过一秒就加进相应的兔子。。
就这个简单了。。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cmath> 5 #include <cstring> 6 #include <queue> 7 #include <stack> 8 #include <map> 9 #include <vector> 10 #include <cstdlib> 11 #include <string> 12 #include <bitset> 13 14 #define PI acos((double)-1) 15 #define E exp(double(1)) 16 #define K 1000000 17 using namespace std; 18 vector<pair<int,int> >p; 19 priority_queue<int>q; 20 bool cmp(pair<int,int> c ,pair<int,int>d) 21 { 22 return c.first>d.first; 23 } 24 int main(void) 25 { 26 int n,ans=0,temp; 27 cin>>n; 28 for(int i=1;i<=n;i++) 29 { 30 scanf("%d",&temp); 31 p.push_back(make_pair(temp,0)); 32 } 33 34 for(int i=0;i<n;i++) 35 scanf("%d",&p[i].second); 36 sort(p.begin(),p.end(),cmp); 37 for(int i=p[0].first,t=0;i>0&&t<n;i--) 38 { 39 while(p[t].first==i && t<n) 40 q.push(p[t++].second); 41 if(!q.empty()) 42 { 43 ans+=q.top(); 44 q.pop(); 45 } 46 47 } 48 printf("%d ",ans); 49 return 0; 50 }