zoukankan      html  css  js  c++  java
  • 51nod 挑剔的美食家

     
    基准时间限制:1 秒 空间限制:131072 KB 分值: 5
    与很多奶牛一样,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
    Output
    * 第1行: 输出1个整数,表示使所有奶牛满意的最小花费。如果无论如何都无法 满足所有奶牛的需求,输出-1
    Input示例
    4 7
    1 1
    2 3
    1 4
    4 2
    3 2
    2 1
    4 3
    5 2
    5 4
    2 6
    4 4
    Output示例
    12

    还是STL大法好啊,一开始想了各种稀奇古怪的解法来做。。。。
    思路:先将牛跟草按鲜嫩程度降序排序,然后枚举每一头牛,将鲜嫩程度大于等于该牛的存起来,然后找第一个大于等于该牛的价格的草;
    并将用过的草删除掉不能再用(由于我们是按照鲜嫩程度降序排序,所以若是满足第i头牛,则一定可以满足第i+1头牛)

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<set>
     4 using namespace std;
     5 typedef long long LL;
     6 const int maxn = 100010;
     7 struct Task{
     8     LL L, R;
     9     bool operator<(const Task&a)const {
    10         if (R == a.R)return L > a.L;
    11         return R > a.R;
    12     }
    13 };
    14 Task a[maxn], b[maxn];
    15 LL n, m, ans = 0;
    16 bool solve()
    17 {
    18     multiset<LL> S;
    19     multiset<LL>::iterator it;
    20     int tmp = 1;
    21     for (int i = 1; i <= n; i++) {
    22         while (b[tmp].R >= a[i].R)S.insert(b[tmp++].L);
    23         it = S.lower_bound(a[i].L);
    24         if (it == S.end())return false;
    25         ans += *it;
    26         S.erase(it);
    27     }
    28     return true;
    29 }
    30 int main()
    31 {
    32     ios::sync_with_stdio(false);
    33     while (cin >> n >> m) {
           ans = 0;
    34 for (int i = 1; i <= n; i++) 35 cin >> a[i].L >> a[i].R; 36 for (int i = 1; i <= m; i++) 37 cin >> b[i].L >> b[i].R; 38 sort(a + 1, a + n + 1); 39 sort(b + 1, b + m + 1); 40 if(solve()) cout << ans << endl; 41 else cout << "-1" << endl; 42 } 43 return 0; 44 }
  • 相关阅读:
    二叉树的线索
    关于JavaScript变量提升的理解
    HTML label标签的一点理解
    超详细轮播图,让你彻底明白轮播图!
    javascript 入门——this属性的理解!
    《机电传动控制》第二次作业
    第四周学习笔记
    学习笔记
    linux下,让命令提示符显示完整路径
    kafka api消费集群中kafka数据报错问题
  • 原文地址:https://www.cnblogs.com/wangrunhu/p/9437271.html
Copyright © 2011-2022 走看看