51nod 挑剔的美食家

  因为要找最小的价格呀

  所以对于每个牛 我们都去找最小的满足条件的草

  将牛和草 的鲜嫩程度从大到小排序

  然后 依次枚举牛

  用 multiset来保存所有满足条件的草的价格

  然后去二分找 第一个大于等于 第i个牛的要求的价格的值  找到之后就erase一下 否则就输出-1

  因为草的鲜嫩程度是从大到小的

  所以满足第一个牛的所有草 它的鲜嫩程度一定满足第二个牛

 

#include <cstdio>
#include <utility>
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
const int maxn = 100100;
struct node{
    int value;  // 价格
    int neng; // 鲜嫩程度
};
bool cmp(node left, node right){
    return left.neng > right.neng;
}
multiset<int > s; // 因为不同草的定价相同
multiset<int > :: iterator it;
node cow[maxn];  // 牛
node grass[maxn]; // 草
int main(){
    int n, m;
    long long int ans = 0;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++){
        scanf("%d%d", &cow[i].value, &cow[i].neng);
    }
    for(int i = 1; i <= m; i++){
        scanf("%d%d", &grass[i].value, &grass[i].neng);
    }
    // 按照草的新鲜程度从大到小排序
    sort(cow + 1, cow + 1 + n, cmp);
    sort(grass + 1, grass + 1 + m, cmp);
    int num = 1;
    for(int i = 1; i <= n; i++){
        while(num <= m && grass[num].neng >= cow[i].neng){
            s.insert(grass[num].value);
            num++;
        }
        //for(it = s.begin(); it != s.end(); ++it){
        //    cout << *it << " ";
        //}
        cout << endl;
        it = s.lower_bound(cow[i].value);  // 找到第一个大于等于第i个牛的要求的最低价
        //cout << *it << endl;
        if(it == s.end()){
            puts("-1");
            return 0;
        }
        ans += *it;
        s.erase(it);
    }
    printf("%lld\n", ans);
    return 0;
}

  

posted @ 2018-07-22 16:53  Terry-Wei  阅读(110)  评论(0编辑  收藏  举报