poj 3622 Gourmet Grazers STL之multiset

25 篇文章 0 订阅
8 篇文章 0 订阅

主要是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 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值