zoukankan      html  css  js  c++  java
  • P2869 [USACO07DEC]美食的食草动物Gourmet Grazers

    P2869 [USACO07DEC]美食的食草动物Gourmet Grazers

    题目描述

    [链接]
    Like so many others, the cows have developed very haughty tastes and will no longer graze on just any grass. Instead, Farmer John must purchase gourmet organic grass at the Green Grass Grocers store for each of his N (1 ≤ N ≤ 100,000) cows.

    Each cow i demands grass of price at least Ai (1 ≤ Ai ≤ 1,000,000,000) and with a greenness score at least Bi (1 ≤ Bi ≤ 1,000,000,000). The GGG store has M (1 ≤ M ≤ 100,000) different types of grass available, each with a price Ci (1 ≤ Ci ≤ 1,000,000,000) and a greenness score of Di (1 ≤ Di ≤ 1,000,000,000). Of course, no cow would sacrifice her individuality, so no two cows can have the same kind of grass.

    Help Farmer John satisfy the cows' expensive gourmet tastes while spending as little money as is necessary.

    约翰的奶牛对食物越来越挑剔了。现在,商店有M 份牧草可供出售,奶

    牛食量很大,每份牧草仅能供一头奶牛食用。第i 份牧草的价格为Pi,口感为

    Qi。约翰一共有N 头奶牛,他要为每头奶牛订购一份牧草,第i 头奶牛要求

    它的牧草价格不低于Ai,口感不低于Bi。请问,约翰应该如何为每头奶牛选

    择牧草,才能让他花的钱最少?

    输入输出格式
    输入格式:

    • Line 1: Two space-separated integers: N and M.

    • Lines 2..N+1: Line i+1 contains two space-separated integers: Ai and Bi

    • Lines N+2..N+M+1: Line i+N+1 contains two space-separated integers: Ci and Di

    输出格式:

    • Line 1: A single integer which is the minimum cost to satisfy all the cows. If that is not possible, output -1.

    输入样例#1:

    4 7
    1 1
    2 3
    1 4
    4 2
    3 2
    2 1
    4 3
    5 2
    5 4
    2 6
    4 4
    

    输出样例#1:

    12
    

    看上去就是就是贪心,可是两个变量,很麻烦,能想办法变成一个变量吗?当然可以。
    对两个cow、grass排序,口感大的在前面,口感相同的随意。。。
    然后取出第 i 只牛,
    1:找到所有口感大于等于这只牛所要求的口感的草,加入某数据结构结构S,发现S中口感似乎已经不重要了。
    2:从S找出最便宜的,加入答案,并把它从S中删除。
    重复1,2,当遍历到任意一头牛时,S中的所有草都是满足这头牛的口感要求的

    
    #include<bits/stdc++.h>
    using namespace std;
    char buf[100000],*L=buf,*R=buf;
    #define gc() L==R&&(R=(L=buf)+fread(buf,1,100000,stdin),L==R)?EOF:*L++;
    template<typename T>
    inline void read(T&x) {
        int flag=x=0;
        char ch=gc();
        while (ch<'0'||ch>'9')flag|=ch=='-',ch=gc();
        while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-48,ch=gc();
        if(flag)x=-x;
    }
    const int MAXN=1e5+10;
    struct Node{
        int a,b;
        bool operator<(const Node&y)const{return b>y.b; }
    }c[MAXN],g[MAXN];
    int n,m;
    int main() {
        freopen("in.txt","r",stdin);
        read(n),read(m);
        if(m<n){cout<<-1;return 0;}
        for(int i=0;i<n;++i)read(c[i].a),read(c[i].b);
        for(int i=0;i<m;++i)read(g[i].a),read(g[i].b);
        sort(c,c+n);
        sort(g,g+m);
        long long ans=0;
        multiset<int>tree;
        multiset<int>::iterator p;
        for(int i=0,j=0;i<n;++i){//遍历牛
            while(j<m&&g[j].b>=c[i].b)tree.insert(g[j++].a);//如果当前的草满足口感要求,加入
            p=tree.lower_bound(c[i].a);//已经满足口感了,查找满足价格的草
            if(p==tree.end()){//没找到
                cout<<-1;
                return 0;
            }
            else{
                ans+=*p;
                tree.erase(p);
            }
        }
        cout<<ans;
        return 0;
    }
    
  • 相关阅读:
    WPF中调用资源字典的方法
    DataGridView控制单元格修改的输入规则
    将dataGridView数据转成DataTable
    窗体打开后设置某个控件为默认的焦点
    自定义控件属性英文类别
    VMWare虚拟机与主机建立共享文件夹
    与.Net大师Jeffrey Richter面对面交流——TUP对话大师系列活动回顾(多图配详细文字)
    一个编程小题目引发的思考(下)
    一个Quicksort究竟可以写到多么短
    我是如何设计并实现一门程序设计语言——一门函数式编程语言Lucida的诞生
  • 原文地址:https://www.cnblogs.com/foursmonth/p/14144902.html
Copyright © 2011-2022 走看看