poj 3622 Gourmet Grazers STL之multiset

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

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

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

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

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

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

#include
#include
#include
#include
#define int long long
using namespace std;
//by mars_ch
int 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;
}

你可能感兴趣的:(usaco,乱搞,stl,usaco,月赛题解)