• 2017ecjtu-summer training # 9 HDU 4544


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

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


    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
     
    题意  中文题很好懂
    解析  很简单 很容易想到    每次选d [ i ]>=b [ i ]且p [ i ]最小的那个箭,p [ i ]加到sum中,暴力搜肯定会超时,所以用到了优先队列
     
    AC代码
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sstream>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #define maxn 100050
    using namespace std;
    typedef long long ll;
    int n,m;
    int b[maxn];
    struct node
    {
        int d;
        int p;
    } n1,n2;
    struct cmp
    {
        bool operator()(node n1,node n2)
        {
            return n1.p > n2.p;
        }
    };
    bool cmp1(node a,node b)
    {
        return a.d>b.d;                //按d降序排序
    }
    bool cmp2(int a,int b)
    {
        return a>b;                    //b降序排序
    }
    struct node jian[maxn];
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            priority_queue<node,vector<node>,cmp> q;        //以node为元素,以p为小顶堆优先队列
            int i,j;
            for(i=0; i<n; i++)
            {
                scanf("%d",&b[i]);
            }
            for(i=0; i<m; i++)
            {
                scanf("%d",&jian[i].d);
            }
            for(i=0; i<m; i++)
            {
                scanf("%d",&jian[i].p);
            }
            sort(b,b+n,cmp2);
            sort(jian,jian+m,cmp1);
            int flag=1;
            ll sum=0;
            int k=0;
            for(i=0; i<n; i++)
            {
                while(k < m&&jian[k].d>=b[i])                 //把大于等于b[i]的箭压进队列
                {
                    q.push(jian[k]);
                    k++;
                }
                if(q.empty())
                {
                    flag=0;
                    break;
                }
                else
                {
                    sum+=q.top().p;
                    q.pop();                                 //删除队顶元素
                }
            }
            if(flag)
                cout<<sum<<endl;
            else
                cout<<"No"<<endl;
        }
    }
    /*
    另外一种定义结构体优先队列代码
    struct node
    {
        int d;
        int p;
       friend bool operator<(node n1,node n2)
        {
            return n1.p > n2.p;
        }
    };
    调用语句 priority_queue<node> q;
    */
  • 相关阅读:
    InnoDB实现MVCC原理
    Python中定义函数时参数有默认值的小陷阱
    Python系统编程笔记
    Python中的字典
    Python中常见的字符串小笔试题
    Oracle常见名词解析
    Oracle数据库面试题【转载】
    Oracle日期语言修改
    Oracle日期时间函数大全
    Oracle数据库分页的三种方法
  • 原文地址:https://www.cnblogs.com/stranger-/p/7242626.html
Copyright © 2020-2023  润新知