• cdoj1334郭大侠与Rabi-Ribi


     地址:http://acm.uestc.edu.cn/#/problem/show/1334

    题目:

    郭大侠与Rabi-Ribi

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

    title

    最近郭大侠迷上了玩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 and output

    Sample InputSample 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 }
    View Code
  • 相关阅读:
    Java中的静态方法
    捕获异常代码
    重载与重写的区别
    继承代码
    Android Studio 快捷键一览
    android两种基本联网方式与一种第三方开源项目的使用
    Android Studio导入github下载的project和module
    SlidingMenu 侧滑菜单的用法
    显示图片的(自定义)吐司Toast
    用volley在Genymotion上获取网页源码
  • 原文地址:https://www.cnblogs.com/weeping/p/5456005.html
Copyright © 2020-2023  润新知