您的位置:首页 > 其它

hdu-4544-湫湫系列故事——消灭兔子-贪心+stl

2016-04-27 00:25 295 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: