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

来源:互联网 发布:程序员 经常出差 编辑:程序博客网 时间:2024/05/12 19:47

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

今天用了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;}




原创粉丝点击