zoukankan      html  css  js  c++  java
  • 湫湫系列故事——消灭兔子

    湫湫系列故事——消灭兔子

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 2985    Accepted Submission(s): 984


    Problem Description
      湫湫减肥
      越减越肥!
      
      最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏。
      游戏规则很简单,用箭杀死免子即可。
      箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为Di(1 <= i <= M),每种箭需要一定的QQ币购买。
      假设每种箭只能使用一次,每只免子也只能被射一次,请计算要消灭地图上的所有兔子最少需要的QQ币。
     
    Input
    输入数据有多组,每组数据有四行;
    第一行有两个整数N,M(1 <= N, M <= 100000),分别表示兔子的个数和箭的种类;
    第二行有N个正整数,分别表示兔子的血量Bi(1 <= i <= N);
    第三行有M个正整数,表示每把箭所能造成的伤害值Di(1 <= i <= M);
    第四行有M个正整数,表示每把箭需要花费的QQ币Pi(1 <= i <= M)。

    特别说明:
    1、当箭的伤害值大于等于兔子的血量时,就能将兔子杀死;
    2、血量Bi,箭的伤害值Di,箭的价格Pi,均小于等于100000。
     
    Output
    如果不能杀死所有兔子,请输出”No”,否则,请输出最少的QQ币数,每组输出一行。
     
    Sample Input
    3 3
    1 2 3
    2 3 4
    1 2 3
    3 4
    1 2 3
    1 2 3 4
    1 2 3 1
     
    Sample Output
    6
    4
     
    这是一道用优先队列来求解的题,我一开始没有想到,自定义了一个sort结果时间超限,一直哇,然后仔细想如何优化
    才勉强写出来,自己找bug还找了半天。
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <queue>
     6 #define  N 100005
     7 using namespace std;
     8 struct Node {
     9     int a, b;
    10 } node[N];
    11 int m[N];
    12 int x, y;
    13 bool cmp(Node x1, Node x2) {
    14     return x1.a < x2.a;
    15 }
    16 priority_queue<int, vector<int>, greater<int> > q;
    17 
    18 int main() {
    19 
    20     while (scanf("%d%d", &x, &y) != EOF) {
    21         while (!q.empty())
    22             q.pop();
    23 
    24         for (int i = 0; i < x; i++)
    25             scanf("%d", &m[i]);
    26         for (int i = 0; i < y; i++)
    27             scanf("%d", &node[i].a);
    28         for (int i = 0; i < y; i++)
    29             scanf("%d", &node[i].b);
    30 
    31         if (x > y) {
    32             printf("No
    ");
    33             continue;
    34         }
    35         sort(m, m + x);
    36         sort(node, node + y, cmp);
    37         int ans = y - 1;
    38         long long int cnt = 0;
    39         bool pi = true;
    40         for (int i = x - 1; i >= 0; i--) {
    41             while (ans >= 0 && node[ans].a >= m[i]) {
    42                 q.push(node[ans].b);
    43                 ans--;
    44             }
    45             if (q.empty()){
    46                 pi = false;
    47                 break;
    48             }
    49             cnt += q.top();
    50             q.pop();
    51         }
    52         if (pi)
    53             printf("%lld
    ", cnt);
    54         else
    55             printf("No
    ");
    56     }
    57     return 0;
    58 }
     
     
  • 相关阅读:
    在线课程的总结
    数据库相关整理
    两个栈实现队列&两个栈实现队列
    Django中间件的5种自定义方法
    Python Web开发之路
    内置函数——format
    Django组件拾忆
    支付宝支付流程
    消息队列之RabbitMQ
    WebSocket
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/7241579.html
Copyright © 2011-2022 走看看