链接:点击打开链接
题意:有N只兔子,每只有一个血量B[i],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D[i],价格为P[i](1 <= i <= M)。假设每种箭只能使用一次,每只免子也只能被射一次,计算要消灭地图上的所有兔子最少需要多少Q币。如不能杀死所有兔子,请输出No Solution。特别说明:1、当箭的伤害值大于等于兔子的血量时,能将兔子杀死;2、血量B[i],箭的伤害值D[i],箭的价格P[i],均小于等于100000。
代码:
#include <queue>
#include <cstdio>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int D,P;
friend bool operator<(node a,node b){
return a.P>b.P;
}
};
bool cmp(node a,node b){
return a.D>b.D;
}
node s[50005];
int B[50005];
int main(){
int N,M,i,j,k,ans,sign;
node temp;
while(scanf("%d%d",&N,&M)!=EOF){ //兔子按照血量逆序排列,箭按照杀伤力正序排列
priority_queue<node> que;
if(N>M){
puts("No Solution");
continue;
}
for(i=0;i<N;i++)
scanf("%d",&B[i]);
for(i=0;i<M;i++)
scanf("%d%d",&s[i].D,&s[i].P);
sort(B,B+N);
sort(s,s+M,cmp);
ans=sign=k=0;
for(i=N-1;i>=0;i--){
while(k<M&&s[k].D>=B[i]){ //把能杀死当前兔子的箭放入优先队列中,用价值最小的那一支
que.push(s[k]);
k++;
}
if(que.size()==0){
sign=1;
break;
}
temp=que.top();
ans+=temp.P;
que.pop();
}
if(sign)
puts("No Solution");
else
printf("%d\n",ans);
}
return 0;
}