1191 消灭兔子

1191 消灭兔子

有N只兔子,每只有一个血量B[i],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D[i],价格为P[i](1 <= i <= M)。假设每种箭只能使用一次,每只免子也只能被射一次,计算要消灭地图上的所有兔子最少需要多少Q币。如不能杀死所有兔子,请输出No Solution。
特别说明:1、当箭的伤害值大于等于兔子的血量时,能将兔子杀死;2、血量B[i],箭的伤害值D[i],箭的价格P[i],均小于等于100000。
Input
第1行:两个整数N,M,中间用空格分隔(1 <= N, M <= 50000),分别表示兔子的个数和箭的种类。
第2 - N + 1行:每行1个正整数(共N行),表示兔子的血量B[i](1 <= B[i] <= 100000)。
第N + 2 - N + M + 1行:每行2个正整数(共M行),中间用空格分隔,表示箭所能造成的伤害值D[i],和需要花费的Q币P[i](1 <= D[i], P[i] <= 100000)。
Output
输出最少需要多少Q币才能消灭所有的兔子。如果不能杀死所有兔子,请输出"No Solution"。
Input示例
3 3
1
2
3
2 1
3 2
4 3
Output示例
6

思路:我们肯定是先杀血多的兔子,那么血少的兔子选择就多了,那么该只兔子是不是选能杀它的箭中花费最少的,优先队列即可
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=50002;
 4 
 5 int n,m;
 6 int a[N];
 7 struct node{
 8     int x,y;
 9 }b[N];
10 struct nnode{
11     int x,y;
12     nnode(int xx,int yy){
13         x=xx;y=yy;
14     }
15    friend bool operator <(nnode x1,nnode x2){
16         return x1.y>x2.y;
17     }
18 };
19 
20 bool cmp(node p,node q){
21     return p.x<q.x;
22 }
23 priority_queue<nnode> p;
24 
25 int main(){
26     scanf("%d%d",&n,&m);
27     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
28     for(int i=1;i<=m;i++){
29         scanf("%d%d",&b[i].x,&b[i].y);
30     }
31     sort(a+1,a+1+n);
32     sort(b+1,b+1+m,cmp);
33     long long sum=0;
34     int t=0;
35     for(int i=n;i>=1;i--){
36         while(b[m].x>=a[i]&&m>=1){
37             p.push(nnode(b[m].x,b[m].y));
38             m--;
39         }
40         if(p.empty()){
41             t=1;break;
42         }
43         sum+=p.top().y;
44    
45         p.pop();
46     }
47     if(t) printf("No solution
");
48     else printf("%I64d
",sum);
49 }
原文地址:https://www.cnblogs.com/hhxj/p/7050318.html