hdu 4268 Alice and Bob(贪心+multiset)

题意:卡牌覆盖,每张卡牌有高(height)和宽(width)。求alice的卡牌最多可以覆盖多少bob的卡牌

思路:贪心方法就是找h可以覆盖的条件下找w最大的去覆盖。

#include<iostream>
#include<stdio.h>
#include<set>
#include<algorithm>
using namespace std;

struct Node{
    int h,w;
    int flag;
}node[200005];

bool cmp(Node a,Node b){
    if(a.h!=b.h)return a.h<b.h;//升序
    if(a.w!=b.w)return a.w<b.w;//升序
    return a.flag>b.flag;//降序
}

multiset<int>mt;
multiset<int>::iterator it;

int main(){
    int t,n,i,ans;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(i=1;i<=n;++i){
            scanf("%d%d",&node[i].h,&node[i].w);
            node[i].flag=1;
        }
        for(i=n+1;i<=2*n;++i){
            scanf("%d%d",&node[i].h,&node[i].w);
            node[i].flag=2;
        }
        sort(node+1,node+1+2*n,cmp);
        mt.clear();
        ans=0;
        for(i=1;i<=2*n;++i){
            if(node[i].flag==2)mt.insert(node[i].w);
            else{
                if(!mt.empty()){
                    it=mt.begin();
                    if(node[i].w>=(*it)){
                        ++ans;
                        it=mt.upper_bound(node[i].w);//指向键值> key的第一个元素。
                        --it;//指向键值<= key的第一个元素。
                        mt.erase(it);
                    }
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2015-08-24 19:19  gongpixin  阅读(198)  评论(0编辑  收藏  举报