HDU-4544 湫湫系列故事——消灭兔子

探讨了如何通过选择合适的箭来最小化消灭所有兔子所需的QQ币数量。使用了贪心算法结合优先队列实现最优解。
 湫湫减肥
  越减越肥!

  最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏。
  游戏规则很简单,用箭杀死免子即可。
  箭是一种消耗品,已知有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;
}

 

转载于:https://www.cnblogs.com/ISGuXing/p/7242605.html

dnSpy是目前业界广泛使用的一款.NET程序的反编译工具,支持32位和64位系统环境。它允许用户查看和编辑.NET汇编和反编译代码,以及调试.NET程序。该工具通常用于程序开发者在维护和调试过程中分析程序代码,尤其在源代码丢失或者无法获取的情况下,dnSpy能提供很大的帮助。 V6.1.8版本的dnSpy是在此系列软件更新迭代中的一个具体版本号,代表着该软件所具备的功能与性能已经达到了一个相对稳定的水平,对于处理.NET程序具有较高的可用性和稳定性。两个版本,即32位的dnSpy-net-win32和64位的dnSpy-net-win64,确保了不同操作系统架构的用户都能使用dnSpy进行软件分析。 32位的系统架构相较于64位,由于其地址空间的限制,只能支持最多4GB的内存空间使用,这在处理大型项目时可能会出现不足。而64位的系统能够支持更大的内存空间,使得在处理大型项目时更为方便。随着计算机硬件的发展,64位系统已经成为了主流,因此64位的dnSpy也更加受开发者欢迎。 压缩包文件名“dnSpy-net-win64.7z”和“dnSpy-net-win32.7z”中的“.7z”表示该压缩包采用了7-Zip压缩格式,它是一种开源的文件压缩软件,以其高压缩比著称。在实际使用dnSpy时,用户需要下载对应架构的压缩包进行解压安装,以确保软件能够正确运行在用户的操作系统上。 dnSpy工具V6.1.8版本的发布,对于.NET程序员而言,无论是32位系统还是64位系统用户,都是一个提升工作效率的好工具。用户可以根据自己计算机的操作系统架构,选择合适的版本进行下载使用。而对于希望进行深度分析.NET程序的开发者来说,这个工具更是不可或缺的利器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值