zoukankan      html  css  js  c++  java
  • BZOJ 1691 [Usaco2007 Dec]挑剔的美食家 multiset+排序+贪心

    Description

    与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了。现在,Farmer John不得不去牧草专供商那里购买大量美味多汁的牧草,来满足他那N(1 <= N <= 100,000)头挑剔的奶牛。 所有奶牛都对FJ提出了她对牧草的要求:第i头奶牛要求她的食物每份的价钱不低于A_i(1 <= A_i <= 1,000,000,000),并且鲜嫩程度不能低于B_i(1 <= B_i <= 1,000,000,000)。商店里供应M(1 <= M <= 100,000)种不同的牧草,第i 种牧草的定价为C_i(1 <= C_i <= 1,000,000,000),鲜嫩程度为D_i (1 <= D_i <= 1,000,000,000)。 为了显示她们的与众不同,每头奶牛都要求她的食物是独一无二的,也就是说,没有哪两头奶牛会选择同一种食物。 Farmer John想知道,为了让所有奶牛满意,他最少得在购买食物上花多少钱。

    Input

    * 第1行: 2个用空格隔开的整数:N 和 M

    * 第2..N+1行: 第i+1行包含2个用空格隔开的整数:A_i、B_i * 第N+2..N+M+1行: 第j+N+1行包含2个用空格隔开的整数:C_i、D_i

    题解:

    考虑先满足口感要求高的,再满足对口感要求低的.
    将草按照口感从大到小排序,再依次枚举每一头牛(口感从大到小).
    枚举到牛 $i$, 设价格为 $b_{i}$, 口感为 $a_{i}$.
    将口感大于等于 $a_{i}$ 的草全部加入 $multiset$ 中.
    我们发现价格没有上限,却有下限,所以选择价格最少的一定对后面的选择影响最小. 同样,对于答案而言也是更优的.
    于是,每次从 $multiset$ 中选择价格最小的即可,并删掉.
    如果发现取不了,则一定是不合法的,输出 $-1$ 即可.
     
     

    Code:

    #include<bits/stdc++.h>
    #define setIO(s) freopen(s".in","r",stdin) 
    #define maxn 100000 
    using namespace std;           
    multiset<int>S; 
    struct Cow{ 
        int a,b;  
        Cow(int a=0,int b=0):a(a),b(b){} 
        bool operator<(Cow c)const{ return b==c.b ? a > c.a : b > c.b;   }
    }cow[maxn];
    struct Grass{
        int a,b; 
        Grass(int a=0,int b=0):a(a),b(b){} 
        bool operator<(Grass c)const{ return c.b==b ? a < c.a : b > c.b;  }
    }G[maxn]; 
    int main(){
        // setIO("input"); 
        int n,m,j=0; 
        long long ans=0; 
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i) scanf("%d%d",&cow[i].a,&cow[i].b); 
        for(int i=1;i<=m;++i) scanf("%d%d",&G[i].a,&G[i].b);         
        sort(cow+1,cow+1+n),sort(G+1,G+1+m); 
        for(int i=1;i<=n;++i){ 
            while(j<m&&G[j+1].b>=cow[i].b) S.insert(G[++j].a); 
            multiset<int>::iterator it=S.lower_bound(cow[i].a);
            if(it==S.end())
            {
                printf("-1
    "); 
                return 0;
            }
            ans+=(long long)*it; 
            S.erase(it);
        }
        printf("%lld
    ",ans); 
        return 0; 
    }
    

      

  • 相关阅读:
    POJ 2636:Electrical Outlets
    POJ 2260:Error Correction
    POJ 2080:Calendar
    POJ 2017:Speed Limit
    POJ 1504:Adding Reversed Numbers
    POJ 1477:Box of Bricks
    POJ 1060:Modular multiplication of polynomials
    HDU 1379:DNA Sorting
    HDU 1009:FatMouse' Trade
    mysql修改初始密码
  • 原文地址:https://www.cnblogs.com/guangheli/p/10948963.html
Copyright © 2011-2022 走看看