• poj3614Sunscreen


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

    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

    Sample Output

    2

    现附上AC代码:

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<algorithm>
    using namespace std;
    int cmp(pair<int ,int > a,pair<int ,int >b){
    if(a.first==b.first) return a.second<b.second;
    else return a.first<b.first;
    }
    int main(){
    int C,L;
    cin>>C>>L;
    pair<int ,int > c[2510],va[2510];
    for(int i=0;i<C;i++)
    scanf("%d%d",&c[i].first,&c[i].second);
    for(int j=0;j<L;j++)
    scanf("%d%d",&va[j].first,&va[j].second);
    priority_queue<int ,vector<int >,greater<int > >q;
    sort(c,c+C,cmp);
    sort(va,va+L,cmp);
    int k=0,sum=0;
    for(int i=0; i<L; i++){
    while(k < C && c[k].first <= va[i].first){
    q.push(c[k].second); k++;
    }
    while( !q.empty() && va[i].second)
    {
    int m = q.top();
    q.pop();
    if(m >= va[i].first) sum++,va[i].second--;
    }
    }
    printf("%d",sum);
    return 0;
    }

    思路:将两个数组的数据从小到大进行排序,

    从最小的防晒霜枚举,将所有符合 防晒度的最小值小于等于该防晒霜的奶牛 最大值放入优先队列之中。然后优先队列是小值先出所以就可以将这些最大值中的最小的取出来。更新答案。

    整体思路:防晒霜(由小到大)肯定是最先供给给最大值最小的奶牛,防止以后其他防晒霜闲置;


    作者:孙建钊
    出处:http://www.cnblogs.com/sunjianzhao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    DNS 主从同步配置
    Linux LVM卷组管理
    python ssh 执行shell命令
    python 批量远程机器,执行Linux命令
    连接管理 与 Netty 心跳机制
    java 注解 知识整理
    SOFARPC —— SPI 解析
    SOFARPC —— Generic Service (泛化调用) 解析
    线程池
    关于ava容器、队列,知识点总结
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/11432025.html
Copyright © 2020-2023  润新知