• 湫湫系列故事——消灭兔子(hdu4544)


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

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


    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
    Source
     
    Recommend
    liuyiding   |   We have carefully selected several similar problems for you:  5609 5608 5607 5605 5604 
    思路:贪心。
    很简单的一个贪心,首先将兔子的血量按从大到小排,再将剑的伤害从大到小排。
    然后优先队列。从兔子的最大值开始,然后找剑的伤害大于等于兔子血量的依次入队,队列是按价格升序排序的。
    如过某个兔子没有剑能将它杀死,也就是队列为空的时候,也就无解。
     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<string.h>
     4 #include<stdlib.h>
     5 #include<iostream>
     6 #include<queue>
     7 using namespace std;
     8 int cmp(const void*p,const void*q);
     9 typedef struct pp
    10 {
    11     long long  x;
    12     long long y;
    13     bool operator<(const pp&cx)const
    14     {
    15         return cx.y<y;
    16     }
    17 } ss;
    18 ss a[100002];
    19 long long aa[100002];
    20 int main(void)
    21 {
    22     long long n,i,j,k,p,q;
    23     long long N,M;
    24     while(scanf("%lld %lld",&p,&q)!=EOF)
    25     {
    26         for(i=1; i<=p; i++)
    27         {
    28             scanf("%lld",&aa[i]);
    29         }
    30         sort(aa+1,aa+1+p);
    31         for(i=0; i<q; i++)
    32         {
    33             scanf("%lld",&a[i].x);
    34         }
    35         for(i=0; i<q; i++)
    36         {
    37             scanf("%lld",&a[i].y);
    38         }
    39         qsort(a,q,sizeof(ss),cmp);
    40         priority_queue<ss>que;
    41         int cnt=0;
    42         int z=q-1;
    43         int flag=0;
    44         long long sum=0;
    45         for(i=p; i>0; i--)
    46         {
    47             for(j=z; j>=0; j--)
    48             {
    49                 if(a[j].x>=aa[i])
    50                 {
    51                     que.push(a[j]);
    52                 }
    53                 else break;
    54             }
    55             z=j;
    56             if(que.empty())
    57             {
    58                 flag=1;
    59                 break;
    60             }
    61             else
    62             {
    63                 ss kl=que.top();
    64                 que.pop();
    65                 if(kl.x<aa[i])
    66                 {
    67                     flag=1;
    68                     break;
    69                 }
    70                 else
    71                 {
    72                     sum+=kl.y;
    73                 }
    74             }
    75         }
    76         if(flag)
    77         {
    78             printf("No
    ");
    79         }
    80         else printf("%lld
    ",sum);
    81     }
    82     return 0;
    83 }
    84 
    85 int cmp(const void*p,const void*q)
    86 {
    87     ss*nn=(ss*)p;
    88     ss*mm=(ss*)q;
    89     return nn->x-mm->x;
    90 }
     
    油!油!you@
  • 相关阅读:
    Sort函数的相关知识
    javascript常用排序算法总结
    机票项目辅助类
    解析机票舱位和子舱位方法
    一个哥们总结的技术知识点
    随鼠标移动的div
    【转】Qt在pro中设置运行时库MT、MTd、MD、MDd,只适合VS版本的Qt
    C++异常及捕获_01
    Qt5_QString_测试
    Qt5_容器_知识点记录
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5147026.html
Copyright © 2020-2023  润新知