• HDU 4544 湫湫系列故事——消灭兔子 (优先队列)


    湫湫减肥 
      越减越肥! 
       
      最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏。 
      游戏规则很简单,用箭杀死免子即可。 
      箭是一种消耗品,已知有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

    题解:

    很裸的优先队列,将给出的攻击力和血量先从小到大排序,将箭压入优先队列里面,然后从血量数组的后面
    开始遍历,每次取出攻击力大于等于它同时价格最小的箭即可。

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <string.h>
     4 #include <algorithm>
     5 #include <queue>
     6 using namespace std;
     7 #define N 100005
     8 #define ll long long
     9 int a[N];
    10 struct arrow
    11 {
    12     int x;//伤害
    13     int y;//花费
    14     friend bool operator<(arrow a,arrow b)
    15     {
    16         return a.y>b.y;
    17     }
    18 }b[N];
    19 bool cmp(arrow a,arrow b)
    20 {
    21     return a.x>b.x;
    22 }
    23 bool cmp1(int a,int b)
    24 {
    25     return a>b;
    26 }
    27 int main()
    28 {
    29     int n,m,i,j;
    30     while(scanf("%d%d",&n,&m)!=EOF)
    31     {
    32         for(i=0;i<n;i++)
    33         scanf("%d",&a[i]);
    34         for(i=0;i<m;i++)
    35         scanf("%d",&b[i].x);
    36         for(i=0;i<m;i++)
    37         scanf("%d",&b[i].y);
    38         sort(a,a+n,cmp1);
    39         sort(b,b+m,cmp);
    40         j=0;
    41         long long sum=0;
    42         int flag=1;
    43         priority_queue<arrow> q;
    44         for(i=0;i<n;i++){
    45             while(b[j].x>=a[i]&&j<m)
    46             q.push(b[j++]);
    47             if(q.empty()){
    48                 flag=0;break;
    49             }
    50             sum+=q.top().y;
    51             q.pop();
    52         }
    53         if(flag==0)
    54         printf("No
    ");
    55         else
    56         printf("%lld
    ",sum);
    57     }
    58     return 0;
    59  }
  • 相关阅读:
    利用JS实现的根据经纬度计算地球上两点之间的距离
    html中meta标签作用详解
    Jquery Highcharts 参数配置说明
    Properties类的使用示例
    利用数据库模版创建方便部署的.Net项目调试环境
    ASP.NET修改Web.Config文件(对xml的操作)
    创建动态数据输入用户界面
    DataGrid相关知识总结(收集自各位老大处)
    在C#.net中如何操作XML
    C#中使用反射的性能分析
  • 原文地址:https://www.cnblogs.com/wydxry/p/7243083.html
Copyright © 2020-2023  润新知