4.卡牌游戏

  • 编程语:C++
  • 单个测试集评测时长限制:3秒
题目描述

小明和小华又推出了一款新游戏。在这个游戏中,他们两人分别有 n 张不同的矩形牌。小明想用他的卡片覆盖小华的卡片。假设有两张矩形牌 ab,如果 a 的高度不小于 ba 的宽度不小于 b,那么 a 可以覆盖 b。聪明的你需要计算小明可以覆盖小华的卡片的最大数量。 注意每张卡只能使用一次,且不能旋转。

输入输出格式

输入格式 第一行有一个整数 n,表示小明和小华分别拥有的矩形牌的数量; 接下来输入 n 行,每行包含两个整数 hw,表示小明矩形牌的高度和宽度。 接下来再输入 n 行,每行包含两个整数 hw,表示小华矩形牌的高度和宽度。 整数之间以空格间隔。 输出格式 针对输入,打印出小明可以覆盖小华的卡片的最大数量。

输入输出样例1

输入 2 1 2 3 4 2 3 4 5 输出 1

输入输出样例2

输入 3 2 3 5 7 6 8 4 1 2 5 3 4 输出 2

说明提示

1≤n≤103,1≤h,w≤108

#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
const int MAX=100000*2+100;
struct rectangular
{ //定义一个矩形牌结构体
    int h,w,bel;
} Rect[MAX];
multiset<int>MulSet;
multiset<int>::iterator iter;
bool cmp1(rectangular a,rectangular b)
{  //比较两个矩形牌大小,比较宽和高,判断是否可以覆盖
    if(a.h!=b.h)
        return a.h<b.h;
    else if(a.w!=b.w)
        return a.w<b.w;
    else
        return a.bel>b.bel;//保证来一个小明的方块后它能覆盖的小华的方块已出现
}
int main()
{
    int i,n,ans,j,Max,ind;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {  //读取输入
        scanf("%d%d",&Rect[i].h,&Rect[i].w);
        Rect[i].bel=1;
    }
    for(i=n; i<2*n; i++)
    {
        //读取输入
        scanf("%d%d",&Rect[i].h,&Rect[i].w);
        Rect[i].bel=2;
    }
    ans=0;
    sort(Rect,Rect+2*n,cmp1); //将矩形牌按大小排序
    for(i=0; i<2*n; i++)
    { //贪心策略求解
        if(Rect[i].bel==1)
        {
            Max=-1;
            for(j=i-1; j>=0; j--)
            { //循环枚举
                if(Rect[j].bel==2)
                {
                    if(Rect[j].w<=Rect[i].w&&
                            Rect[j].w>Max)
                    {
                        Max=Rect[j].w; //找到最大值
                        ind=j;
                    }
                }
            }
            if(Max!=-1)
            {
                ans++; //找到可以覆盖的牌,计数+1
                Rect[ind].bel=-1;
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值