2012长春网络赛 B题(贪心+multiset处理二维问题)

题意:Alice 和Bob各有N个矩形,每个矩形都已自己的高和宽,矩形a能够覆盖矩形b的条件是a.h>=b.h && a.w >= b.w。

问:Alice的矩形最多能覆盖多少个Bob的矩形。(每个矩形只能用一次)

#include<cstdio>
#include<cstring>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;

//模拟存放节点信息
struct NODE { int h, w; };
NODE a[200000], b[200000];

int cmp(const void *p1, const void *p2)
{
    NODE *p3 = (NODE*)p1; //w升序,h升序
    NODE *p4 = (NODE*)p2;
    if(p3->w == p4->w)
        return p3->h - p4->h;
    return p3->w - p4->w;
}

/*
void show(int N)
{
    for(int i = 0; i < N; i++)
        printf("a[%d].h = %d, a[%d].w = %d\n", i, a[i].h, i, a[i].w);

    for(int i = 0; i < N; i++)
        printf("b[%d].h = %d, b[%d].w = %d\n", i, b[i].h, i, b[i].w);
}
*/

int main()
{
    int T, N;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);

        int i, j;
        for(i = 0; i < N; i++)
            scanf("%d%d",&a[i].h, &a[i].w);
        for(i = 0; i < N; i++)
            scanf("%d%d",&b[i].h, &b[i].w);

        qsort(a, N, sizeof(NODE), cmp);
        qsort(b, N, sizeof(NODE), cmp);
        //show(N);

        i = j = 0;
        int res = 0;
        multiset<int, greater<int> > s;
        multiset<int, greater<int> >::iterator it;

        for(i = 0; i < N; i++)
        {
            while(b[j].w <= a[i].w)
            {
                s.insert(b[j].h);
                j++;
            }

            if(s.empty() == true)
                continue;

            it = s.lower_bound(a[i].h);
            int val = (*it);
            if(it != s.end())
            {
                res++;
                it = s.find(val);
                s.erase(it);
            }
        }
        printf("%d\n",res);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值