POJ 3614

Posted lucky-light

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3614相关的知识,希望对你有一定的参考价值。

是用贪心和优先队列, 十分灵巧的进行求解 : 

  这个贪心是十分的巧妙啊

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
using namespace std;

typedef pair<int, int> P;
int C, L;
const int MAX_C = 2500;
const int MAX_L = 2500;
P a[MAX_L];         //存储防晒霜
P b[MAX_C];         //用来进行存储牛
//qsort 排序函数
int cmp(const void *a, const void *b)
    P *aa = (P *)a;
    P *bb = (P *)b;
    return aa->first > bb->first ? 1 : -1;      //SPF 是排序的首选项


int main()

    cin>>C>>L;
    P temp;
    priority_queue<int, vector<int>, greater<int> > pque;             //注意是由大到小出现的
    for(int i = 0; i < C; i++)
        scanf("%d%d", &b[i].first, &b[i].second);
    
    for(int i = 0; i < L; i++)
        scanf("%d%d", &a[i].first, &a[i].second);
    
    //升序排序, 完成对优先队列的存储
    qsort(a, L, sizeof(a[0]), cmp);
    qsort(b, C, sizeof(b[0]), cmp);
   /* printf("SHOW THE BOTTLE!\n");
    for(int i = 0; i < L; i++)  printf("%d %d\n", a[i].first, a[i].second);   puts("");
    printf("SHOW THE COW : \n");
    for(int i = 0; i < C; i++)
        printf("%d  %d\n", b[i].first, b[i].second);
    */
    int res = 0;    int j = 0;
    //一定要注意 a 霜 使用 i  ; b 牛, 使用 j
    for(int i = 0; i < L; i++)     //对防晒霜的数组进行遍历
        while(j < C && a[i].first >= b[j].first)
            pque.push(b[j].second); //将 牛 的最大值, 放在优先队列, 因为他的最小值(区间头部)肯定是满足了, 我们这里关键是看他的最大值(区间尾部)
            j++;
        
        while(!pque.empty() && a[i].second)    //队列不空, 防晒霜没用完
            int x = pque.top(); pque.pop(); //优先队列当中取出
            if(x < a[i].first)  continue;   //头满足, 但是区间尾部不满足
            res++;  a[i].second--;  //进行答案以及防晒霜个数的更新
        
    
    printf("%d\n", res);
    return 0;

 

以上是关于POJ 3614的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3614(Sunscreen)

Sunscreen POJ - 3614(贪心)

poj3614 Sunscreen贪心

POJ 3614

Sunscreen(POJ 3614 优先队列)

POJ 3614 Sunscreen