您的位置:首页 > 其它

HDU-4544-湫湫系列故事——消灭兔子

2013-04-01 11:03 337 查看
昨天这个题被数据量给吓着了,以为贪心没有办法做,结果今天才发现超多人都是用贪心做的。唉,是数据水了?

今天用了2种方法做,其实昨天都有想过。

优先队列:

代码:

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
const int maxn=10e4+10;
using namespace std;
struct row
{
int di;
int pi;
bool operator < (const row &a)const
{
return pi>a.pi;
}
}r[maxn];
priority_queue<row> q;
bool cmp(row a,row b)
{
return a.di<b.di;
}
int a[maxn];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<m;i++)
scanf("%d",&r[i].di);
for(int i=0;i<m;i++)
scanf("%d",&r[i].pi);
sort(a,a+n);
sort(r,r+m,cmp);
int res=m-1,flag=0;
long long ans=0;
while(!q.empty())
q.pop();
for(int i=n-1;i>=0;i--)
{
while(res>=0&&r[res].di>=a[i])
{
q.push(r[res]);
res--;
}
if(q.empty())
{
flag=1;
break;
}
row p=q.top();
ans+=q.top().pi;
q.pop();
}
if(flag)
printf("No\n");
else
printf("%I64d\n",ans);
}
return 0;
}


STL multiset

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=10e4+10;
struct arrow
{
int di;
int pi;
bool operator < (const arrow a)const
{
if(pi==a.pi)
return di>a.di;
return pi<a.pi;
}
}a[maxn];
multiset<int> s;
multiset<int>::iterator it;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
s.clear();
for(int i=0;i<n;i++)
{
int ita;
scanf("%d",&ita);
s.insert(ita);
}
for(int i=0;i<m;i++)
scanf("%d",&a[i].di);
for(int i=0;i<m;i++)
scanf("%d",&a[i].pi);
sort(a,a+m);
long long ans=0;
for(int i=0;i<m;i++)
{
it=s.upper_bound(a[i].di);
if(it!=s.begin())
{
s.erase(s.find(*(--it)));
ans+=a[i].pi;
}
if(s.empty())
break;
}
if(s.empty())
printf("%I64d\n",ans);
else
printf("No\n");

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