HDU 4544 湫湫系列故事——消灭兔子 (优先队列)
湫湫减肥
越减越肥!
最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏。
游戏规则很简单,用箭杀死免子即可。
箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为Di(1 <= i <= M),每种箭需要一定的QQ币购买。
假设每种箭只能使用一次,每只免子也只能被射一次,请计算要消灭地图上的所有兔子最少需要的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
题解:
很裸的优先队列,将给出的攻击力和血量先从小到大排序,将箭压入优先队列里面,然后从血量数组的后面
开始遍历,每次取出攻击力大于等于它同时价格最小的箭即可。
1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 #define N 100005 8 #define ll long long 9 int a[N]; 10 struct arrow 11 { 12 int x;//伤害 13 int y;//花费 14 friend bool operator<(arrow a,arrow b) 15 { 16 return a.y>b.y; 17 } 18 }b[N]; 19 bool cmp(arrow a,arrow b) 20 { 21 return a.x>b.x; 22 } 23 bool cmp1(int a,int b) 24 { 25 return a>b; 26 } 27 int main() 28 { 29 int n,m,i,j; 30 while(scanf("%d%d",&n,&m)!=EOF) 31 { 32 for(i=0;i<n;i++) 33 scanf("%d",&a[i]); 34 for(i=0;i<m;i++) 35 scanf("%d",&b[i].x); 36 for(i=0;i<m;i++) 37 scanf("%d",&b[i].y); 38 sort(a,a+n,cmp1); 39 sort(b,b+m,cmp); 40 j=0; 41 long long sum=0; 42 int flag=1; 43 priority_queue<arrow> q; 44 for(i=0;i<n;i++){ 45 while(b[j].x>=a[i]&&j<m) 46 q.push(b[j++]); 47 if(q.empty()){ 48 flag=0;break; 49 } 50 sum+=q.top().y; 51 q.pop(); 52 } 53 if(flag==0) 54 printf("No\n"); 55 else 56 printf("%lld\n",sum); 57 } 58 return 0; 59 }