很久沒有做題了,詳細統計呢有兩個月了。浪費了兩個月做了一些無關痛癢的事情。在這裡對我的隊友說聲對不起了...接下來好好做題吧..盡量多做點多感悟一點。
分析:
這題在題目裡面說得很清楚了,有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 0x7FFFFFFFusing 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;}