hdu4268贪心

题意:
      两个人有一些图片,矩形的,问a最多能够覆盖b多少张图片..


思路:

      明显是贪心,但是有一点很疑惑,如果以别人为主,每次都用自己最小的切能覆盖敌人的方法就wa,而以自己为主,去覆盖自己可能覆盖的最大就ac了,证明不了,总感觉这东西在孙子兵法里会有,,解题过程就是先吧两个人的所有卡片放一起以 长 小的在前面,如果 长 相等 id 大的(被覆盖那个)在前面排序,保证每一个卡片能覆盖的一定在自己的前面,然后从1开始跑循环,如果当前的点是被覆盖的点,那么直接把他的y扔进set里,否则就从set里取出一个自己能覆盖的最大的那个卡片,这样遍历到最后就行了,我忘记了题目中的y可能不可能重复了,如果可以重复的话直接把set改成muitiset就行了...


#include<stdio.h>
#include<algorithm>
#include<map>
#include<set>

#define N_max 220000
#define inf 2000000000

using namespace std;

typedef struct
{
    int h ,w ,key;
}CARD;

CARD card[N_max];

bool camp(CARD x ,CARD y)
{
    return x.h < y.h || x.h == y.h && x.w < y.w 
    || x.h == y.h && x.w == y.w && x.key < y.key;
}

int main ()
{
    int t ,i ,n ,sum;
    scanf("%d" ,&t);
    while(t--)
    {
        scanf("%d" ,&n);
        for(i = 1 ;i <= n ;i ++)
        {
            scanf("%d %d" ,&card[i].h ,&card[i].w);
            card[i].key = 1;
        }
        for(i = 1 ;i <= n ;i ++)
        {
            scanf("%d %d" ,&card[i + n].h ,&card[i + n].w);
            card[i + n].key = 0;
        }
        map<int ,int >mark;
        set<int>st;
        sort(card + 1 ,card + n + n + 1 ,camp);
        sum = 0;
        st.insert(inf);
        for(n *= 2 ,i = 1 ;i <= n ;i ++)
        {
            if(card[i].key)
            {
                int now = *st.lower_bound(-card[i].w);
                if(now == inf) continue; 
                sum ++;
                mark[now] --;
                if(!mark[now])
                st.erase(now);
            }
            else
            {
                st.insert(-card[i].w);
                mark[-card[i].w] ++;
            }
        }
        printf("%d\n" ,sum);
    }
    return 0;
}
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值