hdu4268Alice and Bob 贪心+multiset

//a,b个有n张卡片,每张卡片都有高度和宽度
//问a最多能盖住多少张b的卡片
//一张卡片要盖住另一张的条件是高度h和宽度w都要大于另一张
//很明显的贪心
//对于b在a中h大于它的宽度找刚好大于等于它的
//用multiset维护
#include<cstdio>
#include<cstring>
#include<iostream>
#include<set>
#include<algorithm>
using namespace std ;
const int maxn = 1e5+10  ;
struct node
{
    int h , w ;
    bool operator < (const struct node tmp)const
    {
        if(h == tmp.h)
        return w > tmp.w ;
        return h > tmp.h ;
    }
}a[maxn] , b[maxn] ;
multiset<int> se ;
int main()
{
    int t ;
    scanf("%d" , &t) ;
    while(t--)
    {
        int n ;
        scanf("%d" , &n) ;
        for(int i = 1;i <= n;i++)
        scanf("%d%d" , &a[i].h , &a[i].w) ;
        for(int i = 1;i <= n;i++)
        scanf("%d%d" , &b[i].h , &b[i].w) ;
        sort(a+1 , a+1+n) ;
        sort(b+1 , b+1+n) ;
        se.clear() ;
        int ans = 0 ;
        int j = 1;
        multiset<int>::iterator it;
        for(int i = 1;i <= n;i++)
        {
            while(a[j].h >= b[i].h && j <= n)
            se.insert(a[j].w),j++ ;
            it = se.lower_bound(b[i].w) ;
            if(it == se.end())continue ;
            ans++ ;
            se.erase(it) ;
        }
        cout<<ans<<endl;
    }
    return 0 ;
}

你可能感兴趣的:(hdu4268Alice and Bob 贪心+multiset)