zoukankan      html  css  js  c++  java
  • poj3614(Sunscreen)优先队列+贪心

    Description

    To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hide with sunscreen when they're at the beach. Cow ihas a minimum and maximum SPF rating (1 ≤ minSPFi ≤ 1,000; minSPFi ≤ maxSPFi ≤ 1,000) that will work. If the SPF rating is too low, the cow suffers sunburn; if the SPF rating is too high, the cow doesn't tan at all........

    The cows have a picnic basket with L (1 ≤ L ≤ 2500) bottles of sunscreen lotion, each bottle i with an SPF rating SPFi (1 ≤ SPFi ≤ 1,000). Lotion bottle i can cover coveri cows with lotion. A cow may lotion from only one bottle.

    What is the maximum number of cows that can protect themselves while tanning given the available lotions?

    Input

    * Line 1: Two space-separated integers: C and L
    * Lines 2..C+1: Line i describes cow i's lotion requires with two integers: minSPFi and maxSPFi
    * Lines C+2..C+L+1: Line i+C+1 describes a sunscreen lotion bottle i with space-separated integers: SPFi and coveri

    Output

    A single line with an integer that is the maximum number of cows that can be protected while tanning

    Sample Input

    3 2
    3 10
    2 5
    1 5
    6 2
    4 1

    先对奶牛阳光强度最小值和防晒霜阳光强度升序排列,枚举每种防晒霜,将阳光强度最小值小于防晒霜阳光强度的奶牛入队,并按照最大值从小到大排列,取出依次最大值最小的奶牛,如果能用防晒霜,答案就加一。


    #include <iostream>
    #include <sstream>
    #include <fstream>
    #include <string>
    #include <map>
    #include <vector>
    #include <list>
    #include <set>
    #include <stack>
    #include <queue>
    #include <deque>
    #include <algorithm>
    #include <functional>
    #include <iomanip>
    #include <limits>
    #include <new>
    #include <utility>
    #include <iterator>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cctype>
    #include <cmath>
    #include <ctime>
    using namespace std;
    
    pair<int, int> cow[2510], bottle[2510];
    
    int main()
    {
        int c, l;
        cin >> c >> l;
        for (int i = 0; i < c; ++i)
            scanf("%d%d", &cow[i].first, &cow[i].second);
        for (int i = 0; i < l; ++i)
            scanf("%d%d", &bottle[i].first, &bottle[i].second);
        sort(cow, cow+c);
        sort(bottle, bottle+l);
        priority_queue<int, vector<int>, greater<int> > q;
        int ans = 0, j = 0;
        for (int i = 0; i < l; ++i)
        {
            while (j < c && cow[j].first <= bottle[i].first)
                q.push(cow[j++].second);
            while (!q.empty() && bottle[i].second)
            {
                int x = q.top();
                q.pop();
                if (x < bottle[i].first)
                    continue;
                ans++;
                bottle[i].second--;
            }
        }
        cout << ans << endl;
        return 0;
    }
    


  • 相关阅读:
    IIS和ASP.NET2.0
    VS.NET里关于不能够使用向导的问题
    CodeFile
    判断一个字符串是否全是数字的多种方法及其性能比较(C#实现)
    托管和非托管资源
    ASP.NET 2.0页面框架的几处变化
    导出QQWry.Dat中IP地址到文件[C#]
    面向对象在数据库应用程序中的应用(dotNet)
    如何取得IP/用户名等信息
    验证Email是否真正存在(上)
  • 原文地址:https://www.cnblogs.com/godweiyang/p/12203958.html
Copyright © 2011-2022 走看看