poj 3622 Gourmet Grazers STL之multiset

来源:互联网 发布:乐视投屏 for mac 编辑:程序博客网 时间:2024/05/21 03:57

主要是STL的应用吧。。。
题意:
有很多种草,有两个属性:价格和新鲜度;有很多牛,它们都会各自需求一种草,要求是其价格最低为ai,新鲜度最低为bi,且这些牛不希望自己的草和别人的一样。问要满足所有需求的最小花费是多少?

题解:
大概是贪心吧。。这种东西还算比较明显吧。。

想不到的算法大概都是贪心或者二分答案?

所以我们把牛的挑剔程度排个序。然后把每种草再排个序。然后枚举每一个牛将符合条件的草的价钱扔进multiset,然后找第一个>=当前牛要求价钱的,删掉。
复杂度的话。不是很会算。
大概O((n+m)logm)的?(⊙o⊙)

所以这篇主要目的,是讲STL应用–multiset
其实大部分操作是和set一样的。

这里用到了插入 insert;
返回 lower_bound;
清除erase();

#include<cstdio>#include<cstring>#include<set>#include<algorithm>#define int long longusing namespace std;//by mars_chint n,m; multiset<int> mt;struct data{    int a,b;}c[100005];struct node{    int a,b;}g[100005];bool cmp1(data a,data b){    return a.b>b.b;}bool cmp2(node a,node b){    return a.b>b.b;}signed main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    {        scanf("%d%d",&c[i].a,&c[i].b);     }      for(int i=1;i<=m;i++)     {        scanf("%d%d",&g[i].a,&g[i].b);     }     sort(c+1,c+n+1,cmp1);     sort(g+1,g+m+1,cmp2);     int p=1;     int ans=0;     for(int i=1;i<=n;i++)   //枚举每一头牛      {        while(c[i].b<=g[p].b && p<=m)        {            mt.insert(g[p++].a);        }        multiset<int>::iterator it=mt.lower_bound(c[i].a);        if(it==mt.end())   //没有元素返回的为指针         {            printf("%d\n",-1);            return 0;         }        ans+=*it;        mt.erase(it);     }     printf("%lld\n",ans);    return 0;}
0 0
原创粉丝点击