1. 程式人生 > 實用技巧 >POJ 3614 Sunscreen 優先佇列

POJ 3614 Sunscreen 優先佇列

//牛按左邊界從小到大排序
//防晒霜按從小到大排序
//貪心的策略是找到 左邊界小於防晒霜 且 有邊界最接近牛
#include<stdlib.h>
#include<iostream>
#include<utility>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXN 2600
typedef pair<int, int> P;


P cow[MAXN], lot[MAXN];


int main(){
    int n, m;
    cin >> n >> m;
    for(int i = 0; i < n; i++) cin >> cow[i].first >> cow[i].second;
    for(int i = 0; i < m; i++) cin >> lot[i].first >> lot[i].second;

    sort(cow, cow+n);
    sort(lot, lot+m);

    int cnt = 0, cow_i = 0;
    priority_queue<int, vector<int>, greater<int> > q;
    for(int i = 0; i < m; i++){
        while(cow_i < n && cow[cow_i].first <= lot[i].first){
            q.push(cow[cow_i++].second);
        }
        while(!q.empty() && lot[i].second > 0){
            int tmp = q.top();
            q.pop();
            if(tmp < lot[i].first) continue;
            cnt++;
            lot[i].second--;
    
        }
    }    
    cout << cnt << endl;
    system("pause");
    return 0;
}