zoukankan      html  css  js  c++  java
  • Sunscreen

    题目描述

    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 i has 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?

    输入

    * 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

    输出

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

    样例输入

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

    样例输出

    2

    分析:把奶牛按最小值排序,防晒霜按固定值排序,从最小的防晒霜枚举,满足条件即放入优先队列。再将最小值取出,更新ans。

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <map>
    #define range(i,a,b) for(int i=a;i<=b;++i)
    #define LL long long
    #define rerange(i,a,b) for(int i=a;i>=b;--i)
    #define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
    using namespace std;
    int C,L;
    pair<int,int> fuck[2505],you[2505];
    priority_queue <int, vector<int>, greater<int> > q;
    bool cmp(pair<int,int>a,pair<int,int>b){
        return a.first<b.first;
    }
    void init() {
        cin >> C >> L;
        range(i, 0, C - 1)cin >> fuck[i].first >> fuck[i].second;
        range(i, 0, L - 1)cin >> you[i].first >> you[i].second;
        sort(fuck,fuck+C,cmp);
        sort(you,you+L,cmp);
    }
    void solve(){
        int j=0,ans=0;
        range(i,0,L-1){
            while(j<C&&fuck[j].first<=you[i].first){
                q.push(fuck[j].second);
                ++j;
            }
            while(!q.empty()&&you[i].second){
                int tmp=q.top();
                q.pop();
                if(tmp<you[i].first)continue;
                ++ans;
                you[i].second--;
            }
        }
        cout<<ans<<endl;
    }
    int main() {
        init();
        solve();
        return 0;
    }
    View Code
  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/Rhythm-/p/9331017.html
Copyright © 2011-2022 走看看