很久没有做题了,详细统计呢有两个月了。浪费了两个月做了一些无关痛痒的事情。在这里对我的队友说声对不起了...接下来好好做题吧..尽量多做点多感悟一点。
分析:
这题在题目里面说得很清楚了,有6种情况,其实这六种情况只是4个矩形的不同摆法。和他的长宽怎么摆是没有关系的。其中1-5的情况是固定的,因为这几种情况比较简单,每个矩形各自的长宽对集合出的大矩形的长宽影响不大。
下面重点分析的就是第六种:
不用管题中的图怎么话,实际上6个图的意思只是矩形的位置,和长宽放置并没有关系。认真你就输了!按这样放置,其实题中图的意思也就是上面的那个图,不论长宽,只分位置。在这样放置的情况下,初始化宽度;
w=0.w+1.w;
h=max(0.h+3.h,1.h+2.h);
在图中0,3相连,1,2相连;
特殊情况呢??所谓的特殊情况就是影响初始情况的,稍加分析可以发现有以下情况:
根据这几种特殊情况就可以来判断了!
/* ID:seven4 LANG:C++ PROB:packrec */ #include<stdio.h> #define INF 0x7FFFFFFF using namespace std; struct REC { int h,w; }; int max( int a,int b ){ return a>b?a:b; } int max( int a,int b,int c ){ return a>max(b,c)?a:max(b,c); } int max( int a,int b,int c,int d ){ return a>max(b,c,d)?a:max(b,c,d); } int min( int a,int b ){ return a<b?a:b; } int ans; bool flag[100]; REC swap( REC R ) { int temp; temp=R.h; R.h=R.w; R.w=temp; return R; } void record( int a,int b ) { if( ans>a*b ) { ans=a*b; for( int i=0;i<100;i++ ) flag[i]=false; } if( ans==a*b ) flag[min(a,b)]=true; } void check( REC *R ) { REC temp; temp.h=temp.w=0; int index=INF; /*1.*/ temp.w=temp.h=0; temp.w=max( R[0].w+R[1].w+R[2].w+R[3].w,temp.w ); temp.h=max( R[0].h,R[1].h,R[2].h,R[3].h ); record(temp.w,temp.h); /*2.*/ temp.w=temp.h=0; temp.w=max( R[0].w+R[1].w+R[2].w,R[3].h ); temp.h=R[3].w+max( R[0].h,R[1].h,R[2].h ); record(temp.w,temp.h); /*3.*/ temp.w=temp.h=0; temp.w=max( R[0].w+R[1].w,R[2].h )+R[3].w; temp.h=max( R[0].h+R[2].w,R[1].h+R[2].w,R[3].h ); record(temp.w,temp.h); /*4,5.*/ temp.w=temp.h=0; temp.w=max( R[1].w,R[2].w )+R[0].w+R[3].w; temp.h=max( R[0].h,R[3].h,R[1].h+R[2].h ); record(temp.w,temp.h); /*6.*/ temp.w=R[0].w+R[1].w; temp.h=max( R[0].h+R[3].h,R[1].h+R[2].h ); if( R[1].h<R[0].h ) temp.w=max( temp.w,R[0].w+R[2].w ); if( R[1].h>R[0].h ) temp.w=max( temp.w,R[1].w+R[3].w ); if( R[1].h<R[3].h+R[0].h ) temp.w=max( temp.w,R[2].w+R[3].w ); temp.w=max( temp.w,R[2].w ); temp.w=max( temp.w,R[3].w ); record(temp.w,temp.h); /**/ } void rotate( REC *R,int num ) { if( num==4 ){ check(R);return ; } R[num]=swap( R[num] ); rotate( R,num+1 ); R[num]=swap( R[num] ); rotate( R,num+1 ); } void permutation( REC *R,int num ) { REC r; if( num==4 ) { rotate( R,0 ); return ; } for( int i=num;i<4;i++ ) { r=R[num];R[num]=R[i];R[i]=r; permutation( R,num+1 ); r=R[num];R[num]=R[i];R[i]=r; } } int main() { freopen( "packrec.in","r",stdin ); freopen( "packrec.out","w",stdout ); REC rec[4]; for( int i=0;i<100;i++ ) flag[i]=0; ans=INF; for( int i=0;i<4;i++ ) scanf( "%d %d",&rec[i].h,&rec[i].w ); permutation( rec,0 ); printf( "%d\n",ans ); for( int i=0;i<100;i++ ) if( flag[i] ) printf( "%d %d\n",i,ans/i ); scanf( "%d",&ans ); return 0; }