- 编程语:C++
- 单个测试集评测时长限制:3秒
题目描述
小明和小华又推出了一款新游戏。在这个游戏中,他们两人分别有 n
张不同的矩形牌。小明想用他的卡片覆盖小华的卡片。假设有两张矩形牌 a
和 b
,如果 a
的高度不小于 b
,a
的宽度不小于 b
,那么 a
可以覆盖 b
。聪明的你需要计算小明可以覆盖小华的卡片的最大数量。 注意每张卡只能使用一次,且不能旋转。
输入输出格式
输入格式 第一行有一个整数 n
,表示小明和小华分别拥有的矩形牌的数量; 接下来输入 n
行,每行包含两个整数 h
和 w
,表示小明矩形牌的高度和宽度。 接下来再输入 n
行,每行包含两个整数 h
和 w
,表示小华矩形牌的高度和宽度。 整数之间以空格间隔。 输出格式 针对输入,打印出小明可以覆盖小华的卡片的最大数量。
输入输出样例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;
}