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

Posted #忘乎所以#

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了湫湫系列故事——消灭兔子相关的知识,希望对你有一定的参考价值。

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

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种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为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
 
这是一道用优先队列来求解的题,我一开始没有想到,自定义了一个sort结果时间超限,一直哇,然后仔细想如何优化
才勉强写出来,自己找bug还找了半天。
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #define  N 100005
 7 using namespace std;
 8 struct Node {
 9     int a, b;
10 } node[N];
11 int m[N];
12 int x, y;
13 bool cmp(Node x1, Node x2) {
14     return x1.a < x2.a;
15 }
16 priority_queue<int, vector<int>, greater<int> > q;
17 
18 int main() {
19 
20     while (scanf("%d%d", &x, &y) != EOF) {
21         while (!q.empty())
22             q.pop();
23 
24         for (int i = 0; i < x; i++)
25             scanf("%d", &m[i]);
26         for (int i = 0; i < y; i++)
27             scanf("%d", &node[i].a);
28         for (int i = 0; i < y; i++)
29             scanf("%d", &node[i].b);
30 
31         if (x > y) {
32             printf("No\n");
33             continue;
34         }
35         sort(m, m + x);
36         sort(node, node + y, cmp);
37         int ans = y - 1;
38         long long int cnt = 0;
39         bool pi = true;
40         for (int i = x - 1; i >= 0; i--) {
41             while (ans >= 0 && node[ans].a >= m[i]) {
42                 q.push(node[ans].b);
43                 ans--;
44             }
45             if (q.empty()){
46                 pi = false;
47                 break;
48             }
49             cnt += q.top();
50             q.pop();
51         }
52         if (pi)
53             printf("%lld\n", cnt);
54         else
55             printf("No\n");
56     }
57     return 0;
58 }

 

 
 

以上是关于湫湫系列故事——消灭兔子的主要内容,如果未能解决你的问题,请参考以下文章

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

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

2017ecjtu-summer training # 9 HDU 4544

HDU 4514 湫湫系列故事――设计风景线 (树形DP)

HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)

HDU4522 湫湫系列故事——过年回家