题意:这道题本质是就是求矩形的嵌套,看一个小的矩形能否嵌套在一个大的矩形中,层层嵌套,问最后能有几个这样的矩形。
思路:贪心,首先按照长度小的放在前面,如果长度相同,就按照宽度小的在前进行排序。这样就能够保证前面的能够放在后面的里面。
#include <iostream>
#include<cstdio>
#include <cstring>
#include <algorithm>
#define N 5005
using namespace std;
struct Wooden
{
int length,width;
bool flag;
}w[N];
bool cmp(const Wooden w1,const Wooden w2)
{
if(w1.length<w2.length)
return true;
else if(w1.length==w2.length&&w1.width<w2.width)
return true;
return false;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&w[i].length,&w[i].width);
w[i].flag=false;
}
sort(w,w+n,cmp);//排序,长度小的,宽度小的在前
int cnt=0,num=0,flag=0;
int length,width;
while(num<n)//还有没有嵌套的
{
cnt++;//用来记录次数
flag=0;
for(int i=0;i<n;i++){
if(flag==0&&!w[i].flag){//第一个没有被访问的
flag=1;
w[i].flag=true;
length=w[i].length;
width=w[i].width;
num++;//被访问的木头个数
}
else if(!w[i].flag&&w[i].length>=length&&w[i].width>=width){//后面的能够放进去的条件,长度和宽度都要大于等于前面的
w[i].flag=true;
length=w[i].length;
width=w[i].width;
num++;
}
}
}
printf("%d\n",cnt);
}
return 0;
}