• 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
    解题思路:
    优先队列,先给兔子血量和箭的伤害排下序,把能杀死兔子的箭存到队列里面,然后选择其中价格低的就可以了,

    实现代码:
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <queue>
    using namespace std;
    #define M 100009
    struct node{
        int x,y;
    }b[M];
    inline bool cmp(node l,node r){
        return l.x<r.x;
    }
    bool cmp1(int x,int y){
        return x>y;
    }
    priority_queue<int, vector<int>, greater<int> > q;
    int main()
    {
        int n,m,i,a[M];
        while(scanf("%d%d",&n,&m)!=EOF){
            while (!q.empty())
                q.pop();
            int flag = 0;
            long long ans=0;
            for(i=0;i<n;i++)
                cin>>a[i];
            for(i=0;i<m;i++)
                cin>>b[i].x;
            for(i=0;i<m;i++)
                cin>>b[i].y;
            if(n>m){
                cout<<"No"<<endl;
                continue;
            }
            sort(a,a+n,cmp1);
            sort(b,b+m,cmp);
            int k = m-1;
            for(i=0;i<n;i++){
                while(k>=0&&b[k].x>=a[i]){
                    q.push(b[k].y);
                    --k;
                }
                if(q.empty()){
                    flag = 1;
                    break;
                }
                ans+=q.top();
                q.pop();
            }
            if(!flag)
            cout<<ans<<endl;
            else
            cout<<"No"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    距离的总和
    [leetcode] 397. Integer Replacement
    [leetcode] 396. Rotate Function
    [leetcode] 398. Random Pick Index
    [leetcode] 399. Evaluate Division
    [算法] get_lucky_price price
    Geoserver(一) Geoserver2.15.4配置发布arcgis切片
    Geoserver(二) geoserver配置mysql插件
    OpenLayers4地图实例-功能齐全
    OpenLayers Node环境安装运行构建-支持Vue集成OpenLayers
  • 原文地址:https://www.cnblogs.com/kls123/p/7239827.html
Copyright © 2020-2023  润新知