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

解题思路:贪心+优先队列裸题。。。后来发现优先队列全忘了,果然还是敲少了代码。果断复习了一下模板。

兔子的血量降序排,将能一剑杀死兔子的剑存入优先队列,再弹出qq币最少的剑就ok。

但是本人在写的时候,想到的是用multiset容器来解决这个问题,开始tle,后面用了二分的一个函数就wa,到现在也不知道怎么解决这个问题。

还是等以后再看吧,如果有大佬愿意指出错误,不胜感激!

ac代码

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 struct Node{
 7     int d;
 8     int cost;
 9 }a[100050];
10 bool cmp1(Node a,Node b)
11 {
12     return a.d<b.d;
13 }
14 struct cmp
15 {
16     bool operator()(int x,int y)
17     {
18             return x>y;
19     }
20 };
21 int num[100050];
22 int main()
23 {
24     int n,m;
25     while(cin>>n>>m)
26     {
27         priority_queue<int,vector<int>,cmp> q;
28         for(int i=0;i<n;i++)
29             scanf("%d",&num[i]);
30         for(int i=0;i<m;i++)
31             scanf("%d",&a[i].d);
32         for(int i=0;i<m;i++)
33             scanf("%d",&a[i].cost);
34         if(n>m)
35         {
36             cout<<"No"<<endl;
37             continue;
38         }
39         sort(num,num+n);
40         sort(a,a+m,cmp1);
41         int t=m-1;
42         bool flag=true;
43         long long ans=0;
44         for(int i=n-1;i>=0;i--)
45         {
46             while(t>=0&&a[t].d>=num[i])
47             {
48                 q.push(a[t].cost);
49                 t--;
50             }
51             if(q.empty())
52             {
53                 flag=false;
54                 break;
55             }
56             ans+=q.top();
57             q.pop();
58         }
59         if(flag)
60             cout<<ans<<endl;
61         else
62             cout<<"No"<<endl;
63     }
64 }

用multiset提交的wa代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
#include<string.h>
using namespace std;
struct Node{
    int d;
    int cost;
}a[100050];
multiset<int> num;
bool cmp(Node a,Node b)
{
    if(a.cost==b.cost)
        return a.d>b.d;
    else
        return a.cost<b.cost;
}
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        num.clear();
        int y;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&y);
            num.insert(y);
        }
        for(int i=0;i<m;i++)
            scanf("%d",&a[i].d);
        for(int i=0;i<m;i++)
            scanf("%d",&a[i].cost);
        sort(a,a+m,cmp);
        if(n>m)
            cout<<"No"<<endl;
        else
        {
            multiset<int>::iterator it,st,last;
            long long sum=0;
            for(int i=0;i<m;i++)
            {
                if(num.empty())
                    break;
                int key=a[i].d;
                if(key<*num.begin())
                    continue;
                if(key>=*num.end())
                {
                    it=num.end();
                    num.erase(--it);
                    sum+=a[i].cost;
                    continue;
                }
                it=num.find(key);
                if(it!=num.end())
                {
                    num.erase(it);
                    sum+=a[i].cost;
                    continue;
                }
                else
                {
                    st=num.begin();
                    last=num.end();
                    it=lower_bound(st,last,key);//二分查找的函数,百度好久才知道。。
                    num.erase(it);
                    sum+=a[i].cost;
                }
            }
            if(num.empty())
                cout<<sum<<endl;
            else
                cout<<"No"<<endl;
        }
    }
    return 0;
}
时间: 2024-12-21 00:50:18

HDU-4544 湫湫系列故事——消灭兔子的相关文章

hdu 4544 湫湫系列故事——消灭兔子 优先队列+贪心

将兔子的血量从小到大排序,箭的威力也从小到大排序, 对于每只兔子将威力大于血量的箭加入队列,写个优先队列使得出来数位价钱最少.. #include<stdio.h> #include<queue> #include<algorithm> #include<iostream> #include<functional> using namespace std; const int maxn=100010; struct tt { int d; int

HDU - 4544 湫湫系列故事――消灭兔子 2013腾讯编程马拉松复赛第三场

Description 湫湫减肥 越减越肥! 最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏. 游戏规则很简单,用箭杀死免子即可. 箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为Di(1 <= i <= M),每种箭需要一定的QQ币购买. 假设每种箭只能使用一次,每只免子也只能被射一次,请计算要消灭地图上的所有兔子最少需要的QQ币. Input 输入数据有多组,每组数据有四行: 第一行有两个整数N,M(1 <= N, M &l

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

湫湫系列故事--消灭兔子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2985    Accepted Submission(s): 984 Problem Description 湫湫减肥 越减越肥! 最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏. 游戏规则很简单,用箭杀死免子即可. 箭是一种消耗品,已知有M种不同类型

【HDOJ】4544 湫湫系列故事——消灭兔子

贪心,普通贪心两层循环TLE了,然后用优先级队列维护内层. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <queue> 6 #include <algorithm> 7 using namespace std; 8 9 #define MAXN 100005 10 11 typedef st

hdu 4502 吉哥系列故事——临时工计划

吉哥系列故事--临时工计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2921    Accepted Submission(s): 1128 Problem Description 俗话说一分钱难倒英雄汉,高中几年下来,吉哥已经深深明白了这个道理,因此,新年开始存储一年的个人资金已经成了习惯,不过自从大学之后他不好意思再向大人要

HDU 4513 吉哥系列故事——完美队形II(Manacher)

Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形: 1.挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个人可以任意: 3.从左到中间那

HDU 4512 吉哥系列故事——完美队形(LCIS)

Problem Description 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则称之为完美队形: 1.挑出的人保持他们在原队形的相对顺序不变: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然,如果m是奇数,中间那个人可以任意: 3.从左到中间那个人,身高需保证递增,如

Hdu 4507 吉哥系列故事——恨7不成妻 (数位DP)

题目链接: Hdu 4507 吉哥系列故事——恨7不成妻 题目描述: 中文题面不描述. 解题思路: 从数据范围可看出是数位DP.根据题目给的限制,如果是求满足限制的数的数目的话,就很简单了.但是这个题目是让求满足题目中限制的数的平方和.我们可以求出区间中满足题目中限制的数的数目,和这些数的和,然后从这两个东西推出这些数的平方和. 假设现在我们已经递归出后面的x-1位满足题目限制的数的数目(num),和(sum),平方和(ssum),当前x位枚举为i,就可以推出当前节点改变为Num += num,

HDU 4502 吉哥系列故事——临时工计划(DP)

Problem Description 俗话说一分钱难倒英雄汉,高中几年下来,吉哥已经深深明白了这个道理,因此,新年开始存储一年的个人资金已经成了习惯,不过自从大学之后他不好意思再向大人要压岁钱了,只能把唯一的希望放到自己身上.可是由于时间段的特殊性和自己能力的因素,只能找到些零零碎碎的工作,吉哥想知道怎么安排自己的假期才能获得最多的工资. 已知吉哥一共有m天的假期,每天的编号从1到m,一共有n份可以做的工作,每份工作都知道起始时间s,终止时间e和对应的工资c,每份工作的起始和终止时间以天为单位