hdu 4544 优先队列+贪心

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

链接:点我

贪心在能杀死某个兔子的箭里选择价格最小的

一开始直接两个for,tle,看了别人代码之后才知道用优先队列

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 #define cl(a) memset(a,0,sizeof(a))
13 #define ts printf("*****
");
14 const int MAXN=100005;
15 int b[MAXN],d[MAXN],p[MAXN];
16 int n,m,tt;
17 struct node
18 {
19     int d,p;
20 }a[MAXN];
21 bool cmp1(node a,node b)
22 {
23     return a.d>b.d;
24 }
25 struct cmp
26 {
27     bool operator()(int x,int y)
28     {
29         return x>y;
30     }
31 };
32 priority_queue<int,vector<int>,cmp > q;
33 bool vis[MAXN];
34 int main()
35 {
36     int i,j,k;
37     #ifndef ONLINE_JUDGE
38     freopen("1.in","r",stdin);
39     #endif
40     while(scanf("%d%d",&n,&m)!=EOF)
41     {
42         while(!q.empty())   q.pop();
43         for(i=0;i<n;i++)    scanf("%d",&b[i]);
44         for(i=0;i<m;i++)    scanf("%d",&a[i].d);
45         for(i=0;i<m;i++)    scanf("%d",&a[i].p);
46         sort(b,b+n);
47         sort(a,a+m,cmp1);
48         long long ans=0;
49         bool f=1;
50         int t=0;
51         for(i=n-1;i>=0;i--)
52         {
53             while(t<=m-1&&a[t].d>=b[i])
54             {
55                 q.push(a[t].p);
56                 t++;
57             }
58             if(q.empty())
59             {
60                 f=0;
61                 break;
62             }
63             ans+=q.top();
64             q.pop();
65         }
66         if(!f)  printf("No
");
67         else printf("%I64d
",ans);
68     }
69 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4472922.html