http://acm.hdu.edu.cn/showproblem.php?pid=4544
先排序直接贪心判断是否能杀死所有兔子
然后 按降序遍历兔子的生命值
把大于等于当前兔子生命值的箭都丢进优先队列or set 然后每次贪心选最小的即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
int d[100005];
int b[100005];
int p[100005];
struct node
{
int d,p;
node() {}
node(int a,int b)
{
d=a,p=b;
}
bool operator <(const node&b) const
{
return p>b.p;
}
};
bool cmp(node a,node b)
{
return a.d>b.d;
}
node tmp[100005];
priority_queue<node> q;
int main()
{
int n,m;
while(cin>>n>>m)
{
int i,j;
while(!q.empty()) q.pop();
for (i=1; i<=n; i++) scanf("%d",&b[i]);
for (i=1; i<=m; i++) scanf("%d",&d[i]);
for (i=1; i<=m; i++) scanf("%d",&p[i]);
for (i=1; i<=m; i++)
tmp[i].d=d[i],tmp[i].p=p[i];
if (m<n)
{
printf("No\n");
continue;
}
sort(b+1,b+1+n);
sort(tmp+1,tmp+1+m,cmp);
int idx=1;
int flag=0;
for (i=n; i>=1; i--)
{
if (tmp[idx].d>=b[i]) ;
else
{
flag=1;
break;
}
idx++;
}
if (flag)
{
printf("No\n");
continue;
}
idx=1;
long long sum=0;
for (i=n; i>=1; i--)
{
for (j=idx; j<=m; j++)
{
if (tmp[j].d>=b[i])
{
q.push(tmp[j]);
if (j==m) idx=m+1;
}
else
{
idx=j;
break;
}
}
sum+=q.top().p;
q.pop();
}
printf("%lld\n",sum);
}
return 0;
}