用优先队列的贪心,兔子按血量大到小排序,箭按伤害高到低排序 队列按Q币少的先弹出
如果能杀血最多的兔子,就入队列,不能杀时(若队列里有箭头则弹出一个杀,没有箭头就杀不死兔子)
#include<iostream>
#include<algorithm>
#include<queue>
#include<string.h>
#define maxn 100100
#define ll long long
using namespace std;
struct node
{
int d;
ll price;
bool operator < (const node& a) const{return price > a.price;}
} Q[maxn];
bool cmp1(int a,int b){return a>b;}
bool cmp(node a,node b){return a.d>b.d;}
priority_queue<node>q;
int num[maxn];
int n,m;
ll get_sum()
{
int sum=0;
long long t=0;
while(!q.empty())
q.pop();
for(int i=0; i<m; i++)
if(Q[i].d>=num[sum])
q.push(Q[i]);
else
{
if(q.empty())
return -1;
//为了避免Node[i].d<num[sum]当前值,跳出判断,必须在找到它
t+=q.top().price;
q.pop();
i--;
sum++;
if(sum==n) return t;
}
for(int i=sum; i<n; i++)
{
if(q.empty())
return -1;
t+=q.top().price;
q.pop();
}
return t;
}
int main()
{
ll ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0; i<n; i++)scanf("%d",&num[i]);
for(int j=0; j<m; j++)scanf("%d",&Q[j].d);
for(int j=0; j<m; j++)scanf("%lld",&Q[j].price);
if(n>m){printf("No\n");continue;}
sort(num,num+n,cmp1);
sort(Q,Q+m,cmp);
ans=get_sum();
if(ans==-1)printf("No\n");
else printf("%I64d\n",ans);
}
return 0;
}