题目链接:https://www.jisuanke.com/course/615/28104
题目思路:
_这道题需要用到前面介绍过的贪心策略,因此在这里直接给出算法的过程,你只需要借助priority_queue
来实现它。_首先将蚂蚁按照血量从大到小排序,并把鞋子(可以使用结构体或pair
来保存鞋子的伤害值和费用)按照伤害值从高到低排序。逐个计算每只蚂蚁需要用哪双鞋子来踩,对于当前蚂蚁的血量
ant,把所有伤害值不小于 ant 的鞋子放入优先队列中。在这个优先队列中,费用低的鞋子优先级越高。在每次将鞋子放入优先队列后,让优先队列的队首元素(费用最低的鞋子)出队并累积总费用。不断循环,直到算出每只蚂蚁对应的鞋子,或者发现没有可用的鞋子时直接输出No
。
代码:
#include <bits/stdc++.h>
using namespace std;
struct node{
int d;//
int c;//价格
bool operator<(const node &a)const{
return c>a.c;//重载,从小到大
}
};
struct xiezi{
int d;
int c;
}m[100100];
bool cmp1(int a,int b)
{
return a>b;
}
bool cmp2(xiezi a,xiezi b)
{
return a.d>b.d;
}
int a[100100];
int main()
{
int N,M;
priority_queue<node>Q;
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++) scanf("%d",&a[i]);
for(int i=0;i<M;i++) scanf("%d",&m[i].d);
for(int i=0;i<M;i++) scanf("%d",&m[i].c);
sort(a,a+N,cmp1);
sort(m,m+M,cmp2);
int flag=0;
int j=0;
int ans=0;
for(int i=0;i<N;i++){
while(m[j].d>=a[i]){
node tmp;
tmp.c=m[j].c,tmp.d=m[j].d;
j++;
Q.push(tmp);
}
if(Q.size()==0) flag=1;
else{
ans+=Q.top().c;
Q.pop();
}
}
if(flag) printf("No\n");
else printf("%d\n",ans);
}