• hdoj 4544 B


     湫湫减肥 
      越减越肥! 
       
      最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏。 
      游戏规则很简单,用箭杀死免子即可。 
      箭是一种消耗品,已知有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 /*将兔子的血量从大到小排序,将剑的杀伤力从大到小排序,
     2 对于每一个兔子血量,将比他大的杀伤力大的剑压入优先队列,
     3 优先队列自己重写,让它每次抛出的数为价钱最小的
     4 定义优先队列
     5 priority_queueq;
     6 struct node{
     7 int d;
     8 int p;
     9 }
    10 friend bool operator<(node c,node d){
    11 //此行中的<是固定的,需要自己写的只有括号里边的
    12 return c.p>d.p;//实际优先队列抛出的q.top().p是优先队列里边最小的
    13 }
    14 }b[N];
    15 */
    16 #include<stdio.h>
    17 #include<iostream>
    18 #include<algorithm>
    19 using namespace std;
    20 #define N 100005
    21 #include<queue>
    22 struct node{
    23     int d;
    24     int p;
    25     friend bool operator<(node c,node d){
    26         return c.p>d.p;
    27     }
    28 }b[N];
    29 int a[N];
    30 int cmp(int a,int b){
    31     return a>b;
    32 }
    33 int cmp1(struct node a,struct node b){
    34     return a.d>b.d;
    35 }
    36 int main(){
    37     int n,m;
    38     while(scanf("%d%d",&n,&m)!=EOF){
    39         priority_queue<node> q;//定义注意类型是node
    40         for(int i=1;i<=n;i++)
    41         scanf("%d",&a[i]);
    42         for(int i=1;i<=m;i++)
    43         scanf("%d",&b[i].d);
    44         for(int i=1;i<=m;i++)
    45         scanf("%d",&b[i].p);
    46         sort(a+1,a+n+1,cmp);
    47         sort(b+1,b+m+1,cmp1);
    48         int res=1;
    49         long long ans=0;
    50         int flag=0;
    51         for(int i=1;i<=n;i++){
    52             while(res<=m&&b[res].d>=a[i]){
    53                 q.push(b[res]);
    54                 //printf("&&&%d
    ",q.top().p);   加上返回NO
    55                 res++;
    56             }
    57             if(q.empty()){
    58                 flag=1;
    59                 break;
    60             }
    61             else{
    62                 ans+=q.top().p;
    63                 q.pop();
    64             }
    65         }
    66         if(flag==1)
    67         printf("No
    ");
    68         else
    69         cout<<ans<<endl;
    70         //printf("%lld
    ",ans);此题不知道为什么只能用cout输出,这样写wrong了一遍
    71     }
    72     return 0;
    73 }
     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 #define N 100005
     6 #include <queue>
     7 struct node{
     8 int d,p;
     9 friend bool operator<(node c,node d){
    10     return c.p>d.p;
    11     }
    12 }b[N] ;
    13 int a[N];
    14 int cmp(int a,int b){
    15     return a>b;
    16 }
    17 int cmp2(struct node a,struct node b){
    18     return a.d>b.d;
    19 }
    20 int main(){
    21     int n,m;
    22     while(~scanf("%d%d",&n,&m)){
    23         priority_queue<node> q;
    24         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    25         for(int i=1;i<=m;i++) scanf("%d",&b[i].d);
    26         for(int i=1;i<=m;i++) scanf("%d",&b[i].p);
    27         sort(a+1,a+n+1;cmp);
    28         sort(b+1,b+m+1;cmp2);
    29         int res=1;
    30         long long ans=0;
    31         int flag=0;
    32         for(int i=1;i<=n;i++){
    33             while(res<=m&&b[res].d>=a[i]){
    34                 q.push(b[res])
    35                 res++
    36             }
    37             if(q.empty()){
    38                 flag=1;
    39                 break;
    40             }
    41             else {
    42                 ans+=q.top.p;
    43                 q.pop();
    44             }
    45         }
    46         if(flag==1) printf("NO
    ");
    47         else  cout<<ans<<endl;
    48     }
    49     return 0;
    50 }
     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 struct arrow
     5 {
     6     __int64 d,p;
     7 };
     8 bool cmp(__int64 a,__int64 b)
     9 {
    10     return a>b;
    11 }
    12 bool cmp1(arrow a,arrow b)   //  按照 Q币的升序 排序
    13 {
    14     return a.p<b.p;
    15 }
    16 int main()
    17 {
    18     __int64 n,i,j,m,jishu,b[10011],count,num;
    19     arrow a[100011];
    20     while(scanf("%I64d%I64d",&n,&m)!=EOF)
    21     {
    22         num=count=0;
    23         for(i=0;i<n;i++)
    24             scanf("%I64d",&b[i]);
    25         for(i=0;i<m;i++)
    26             scanf("%I64d",&a[i].d);
    27         for(i=0;i<m;i++)
    28             scanf("%I64d",&a[i].p);
    29         sort(b,b+n,cmp);          //   兔子的 血量 降序
    30         sort(a,a+m,cmp1);   //箭的 加个 升序
    31         for(i=0,num=n;i<n;i++)  //从最厉害的  兔子开始杀
    32         {
    33             for(j=0;j<m;j++) //  从最便宜的 箭  开始 一个一个试
    34             {
    35                 if(a[j].d==-1)
    36                     continue;
    37                 if(a[j].d>=b[i])  //如果 箭的伤害 大于兔子的血量的话.
    38                 {
    39                     a[j].d=-1;                //该  箭   失效           //这一句和下一句如果加上 就超时 如果不加上 就300ms.........
    40                     num--;
    41                     count=count+a[j].p;            //计算  花费
    42                     break;
    43                 }
    44             }
    45         }
    46         if(num==0)
    47             printf("%I64d
    ",count);
    48         else
    49             printf("No
    ");
    50     }
    51 }


  • 相关阅读:
    web服务器
    javascript对象属性为空的判断
    字符编码:ASCII,Unicode和UTF-8
    javascript 中英文字符长度和截断处理
    函数节流与去抖
    互联网协议
    解读 v8 排序源码
    乱序
    递归
    函数记忆
  • 原文地址:https://www.cnblogs.com/z-712/p/7324444.html
Copyright © 2020-2023  润新知