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\n"); 48 else printf("%I64d\n",sum); 49 }