2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi 优先队列

J - 郭大侠与Rabi-Ribi

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit  Status

2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi 优先队列_第1张图片

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

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

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

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

但是,兔子实在是太多了,郭大侠的锤子每一秒钟只能敲晕一只兔子,而且每一只兔子只会在地面上逗留 a[i]    秒,

a[i]    秒之后,这一只兔子就会跑回自己的小窝里面。

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

Input

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

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

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

1N100000                                        

1a[i]5000                            

1v[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

Source

2016 UESTC Training for Data Structures  Problem J

My Solution

用STL里的优先队列,

倒过来做处理兔子出现的时间,总时间为maxT

那样出现就丢到优先队列里去,从这个时刻起就一直都存在了

没个时刻拿一只最大的出来 pq.top()打晕就好了

复杂度 O(n)

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>

using namespace std;
const int maxn = 100000 +8;

struct interval{
    int a,v;
} val[maxn];

priority_queue<int> pq;

bool cmp(const interval& x, const interval& y)
{
    return x.a < y.a;
}
int main()
{
    #ifdef LOCAL
    freopen("a.txt", "r", stdin);
    #endif // LOCAL
    int n;
    long long ans = 0;
    scanf("%d", &n);
    for(int i = 0 ; i < n; i++)
        scanf("%d", &val[i].a);
    for(int i = 0 ; i < n; i++)
        scanf("%d", &val[i].v);

    sort(val, val+n, cmp);
    int sametime = val[n-1].a;
    for(int i = n-1; i >= 0; i--){
        if(sametime == val[i].a) pq.push(val[i].v);
        else{
            for(int j = sametime; j > val[i].a; j--){
                if(!pq.empty()){
                    ans += pq.top();
                    pq.pop();
                }
            }
            pq.push(val[i].v);            //
            sametime = val[i].a;
        }
    }
    for(int j = sametime; j > 0; j--){
        if(!pq.empty()){
            ans += pq.top();
            pq.pop();
        }
    }
    //!无论如何就是给我输出-1,就算输出前加个ans = 100;还是不行 重启也不行  然后重新建一个project有正常了⊙﹏⊙b汗
    printf("%lld", ans);
    return 0;
}


Thank you!

                                                                                                                                               ------from ProLights

你可能感兴趣的:(ACM,for,priority_queue,Data,Training,uestc,2016,structures)