ny16 矩形嵌套

矩形嵌套

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
输入
第一行是一个正正数N(0<N<10),表示测试数据组数,
每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽
输出
每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行
样例输入
1
10
1 2
2 4
5 8
6 10
7 9
3 1
5 8
12 10
9 7
2 2
样例输出
5
解法一:按照面积大小和面积相同的按照长度进行排序
 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     int t,l1,l2,l3,sum,n;
 6     int i,j,m;
 7     int a[1010],b[1010],c[1010],d[10010];
 8     scanf("%d",&t);
 9     while(t--)
10     {sum=0;memset(d,0,sizeof(d));
11         scanf("%d",&n);
12         for(i=0;i<n;i++)
13         {
14         scanf("%d %d",&a[i],&b[i]);
15         if(a[i]>b[i])
16         {m=a[i];a[i]=b[i];b[i]=m;}
17         c[i]=a[i]*b[i];
18         }
19         for(j=0;j<n-1;j++)
20            for(i=0;i<n-1-j;i++)
21            {
22            if(c[i]>c[i+1])//按照面积先进行排序
23            {
24                int x=c[i];c[i]=c[i+1];c[i+1]=x;
25                int y=a[i];a[i]=a[i+1];a[i+1]=y;
26                int z=b[i];b[i]=b[i+1];b[i+1]=z;
27             }
28               if(c[i]==c[i+1])
29            {
30                    if(b[i]>b[i+1])如果面积相同的,按照长进行排序
31                {
32                int x=c[i];c[i]=c[i+1];c[i+1]=x;
33                int y=a[i];a[i]=a[i+1];a[i+1]=y;
34                int z=b[i];b[i]=b[i+1];b[i+1]=z;
35                }
36            }
37            }
38           // for(i=0;i<n;i++)
39         //       printf("%d %d %d
",a[i],b[i],c[i]);//
40          for(i=1;i<n;i++)
41          {sum=0;
42              for(j=0;j<i;j++)
43 
44             if(c[j]>c[j-1])
45             {
46                 if((a[i]>a[j] && b[i]>b[j]) && d[j]+1>d[i])
47                 {
48                  d[i]=d[i]+1;//贪心法,的累加
49                 }
50             }
51             if(d[i]>sum)
52                 sum=d[i];
53          }
54                printf("%d
",sum+1);
55     }
56     return 0;
57 }

解法二:直接按照长进行排序
 1 #include"stdio.h"
 2 #define M 1024
 3 main(){
 4 int m,n,t,i,j,x;
 5 float 
 6 a[M],b[M];
 7 scanf("%d",&m);
 8 for(x=0;x<m;x++){
 9 int 
10 c[M]={0};
11 scanf("%d",&n);
12 for(i=0;i<=n-1;i++){
13 scanf("%f 
14 %f",&a[i],&b[i]);
15 if(a[i]<b[i]){
16 t=b[i];
17 b[i]=a[i];
18 a[i]=t;}
19 }
20 for(i=0;i<n-1;i++){
21 for(j=0;j<n-i-1;j++)
22 if(a[j]>a[j+1]){
23 t=a[j];
24 a[j]=a[j+1];
25 a[j+1]=t;
26 t=b[j];
27 b[j]=b[j+1];
28 b[j+1]=t;
29 }}
30 for(i=0;i<n-1;i++)
31 for(j=i+1;j<n;j++)
32 {
33 if(b[j]>b[i]&&a[i]<a[j]){
34 if(c[j]<(c[i]+1))
35 c[j]=c[i]+1;
36 }
37 }
38 for(i=0;i<n-1;i++)
39 if(c[i]>c[i+1])
40 c[i+1]=c[i];
41 c[i]++;
42 if(n<=0)c[i]=0;
43 printf("%d
",c[i]);
44 }}
原文地址:https://www.cnblogs.com/lovychen/p/3196496.html