usaco_packrec暴搜

usaco_packrec暴搜

这道题给了6个图,实际只需考虑5种(后两个相同)。最后一个模型自己没有抽象出来。还是逻辑清晰,比较不容易出错。头开始设许多临时变量,总是不知道具体值是多少,结果一直debug,还一直bug。。⊙﹏⊙b汗。。用4个rec结构记录比较好。
最后一个模型,是左边两个,右边两个,然后根据两边上面矩形的高度情况,讨论矩形整体的宽。
注意,自己设的变量最好还是写出来吧。此题竖着的边|,分别用b,w;横着的—用a,l;

/**/ /*
ID:greenwo1
PROG:packrec
LANG:C++
*/

#include
< cstdio >
#include
< cstring >
#include
< cmath >
#include
< algorithm >
#include
< cstdlib >

// #define MAX(a,b) (a)>(b)?(a):(b)
int  cmp( const   void *  a, const   void *  b)
{
    
return *(int*)b-*(int*)a;
}

int  MAX( int  a, int  b)
{
    
return a>b?a:b;
}

struct  Rec {
    
int l,w;
}
;
int  p[ 52 ],q[ 52 ],wid,hi,ct,area = 1999999999 ,tmp;
bool  used[ 5 ];
Rec tg[
4 ],bott,top,left,right,cur;
void  lyot( int  type, int  a, int  b, int  ith)
{
    
int i;
    Rec saved,old;
    
if(type==3&&a==3&&b==2&&ith==2&&used[0]/**//*&&used[2]&&used[1]*/)/**/////////////////
                {
                    area
=area;
                }

    
if(ith>=5)
    
{
        
if(cur.l*cur.w<area)
            
{
                area
=cur.l*cur.w;
                memset(p,
9,sizeof(p));
                memset(p,
9,sizeof(p));
                ct
=0;
                p[ct
++]=MAX(cur.l,cur.w);
                
if(area==24)/**/////////////////
                {
                    area
=area;
                }

            }

            
else if(cur.l*cur.w==area)
            
{
                
for(i=0;i<ct;i++)
                
if(cur.l==p[i]||cur.w==p[i])break;
                
if(i==ct)p[ct++]=MAX(cur.l,cur.w);
                
/**//*cur.l=0;
                cur.w=0;
*/

                
            }

        
return;
    }

    old
=cur;
    
for(i=0;i<5;++i)//
        if(!used[i])
        
{    
            
if(i==4&&ith!=4)break;
            cur
=old;
            
switch(type)
            
{
            
/**//*    for(i=0;i<4;++i)
                        if(!used[i])break;
*/

            
case 0:    
                cur.w
=MAX(cur.w,b);
                cur.l
+=a;
                saved
=cur;
                
/**//*for(i=0;i<4;++i)
                    if(!used[i])break;
*/

                used[i]
=1;
                lyot(type,tg[i].l,tg[i].w,ith
+1);
                cur
=saved;
                lyot(type,tg[i].w,tg[i].l,ith
+1);

                used[i]
=0;
                
break;
            
case 1:
                
switch(ith)
                
{
                
case 1:
                    
//a=l,b=w
                    used[i]=1;
                    bott.l
=a;
                    bott.w
=b;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);//b swap a
                    used[i]=0;
                    wid
=0;
                    
break;
                
case 2:
                    used[i]
=1;
                    right.l
=a;
                    right.w
=b;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);//b swap a
                    used[i]=0;
                    
break;
                
case 3:
                    used[i]
=1;
                    left.l
=a;
                    left.w
=b;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);//b swap a
                    used[i]=0;
                    
break;
                
case 4:
                    cur.l
=MAX(a+left.l+right.l,bott.l);
                    cur.w
=MAX(MAX(left.w,right.w),b)+bott.w;
                    used[i]
=1;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);
                    used[i]
=0;
                    
break;
                
default:break;
                }

                    
break ;
            
case 2:
            
switch(ith)
                
{
                
case 1:
                    used[i]
=1;
                    bott.l
=a;
                    bott.w
=b;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);//b swap a
                    used[i]=0;
                    wid
=0;
                    hi
=0;
                    
break;
                
case 2:
                    used[i]
=1;
                    right.l
=a;
                    right.w
=b;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);
                    used[i]
=0;
                    
break;
                
case 3:
                    used[i]
=1;
                    left.l
=a;
                    left.w
=b;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);
                    used[i]
=0;
                    
break;
                
case 4:
                    cur.l
=MAX(left.l+a,bott.l)+right.l;
                    cur.w
=MAX(right.w,MAX(b,left.w)+bott.w);
                    used[i]
=1;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);
                    used[i]
=0;
                    
break;
                
default:break;
                }

                    
break ;
            
case 3:
                    
switch(ith)
                    
{
                    
case 1:
                        used[i]
=1;
    
                        right.w
=b;
                        right.l
=a;
                        saved
=cur;
                        lyot(type,tg[i].l,tg[i].w,ith
+1);
                        cur
=saved;
                        lyot(type,tg[i].w,tg[i].l,ith
+1);
                        used[i]
=0;
                        wid
=b;
                        hi
=0;
                        tmp
=0;
                        
break;
                    
case 2:
                        used[i]
=1;
                        top.w
=b;
                        top.l
=a;
                        saved
=cur;
                        lyot(type,tg[i].l,tg[i].w,ith
+1);
                        cur
=saved;
                        lyot(type,tg[i].w,tg[i].l,ith
+1);
                        used[i]
=0;
                        
break;
                    
case 3:
                        used[i]
=1;
                        bott.w
=b;
                        bott.l
=a;
                        saved
=cur;
                        lyot(type,tg[i].l,tg[i].w,ith
+1);
                        cur
=saved;
                        lyot(type,tg[i].w,tg[i].l,ith
+1);
                        used[i]
=0;
                        
break;
                    
case 4:
                        cur.l
=a+MAX(bott.l,top.l)+right.l;
                        cur.w
=MAX(right.w,MAX(bott.w+top.w,b));
                        used[i]
=1;
                        saved
=cur;
                        lyot(type,tg[i].l,tg[i].w,ith
+1);
                        cur
=saved;
                        lyot(type,tg[i].w,tg[i].l,ith
+1);
                        used[i]
=0;
                        
break;
                    
default:break;
                    }

                    
break ;
            
case 4:
                
switch(ith)
                
{
                
case 1:
                    top.w
=b;
                    top.l
=a;
                    used[i]
=1;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);
                    used[i]
=0;
                    
break;
                
case 2:
                    right.l
=a;
                    right.w
=b;
                    
/**//*cur.w=top.w+right.w;*/
                    used[i]
=1;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);
                    used[i]
=0;
                    
break;
                
case 3:
                    bott.w
=b;
                    bott.l
=a;
                    
/**//*cur.l=bott.l+right.l;
                    if(right.l<top.l)
                    cur.w=MAX(bott.w+top.w,cur.w);
                    else cur.w=MAX(bott.w,cur.w);
*/

                    used[i]
=1;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);
                    used[i]
=0;
                    
break;
                
case 4:
                    cur.w
=MAX(bott.w+b,top.w+right.w);
                    
if(right.w>=b+bott.w)cur.l=MAX(bott.l+right.l,MAX(a+right.l,top.l));
                    
else if(right.w<b+bott.w&&right.w>bott.w)cur.l=MAX(a+top.l,MAX(a+right.l,bott.l+right.l));
                    
else if(bott.w>=top.w+right.w)cur.l=MAX(a,MAX(top.l+bott.l,right.l+bott.l));
                    
else if(bott.w<top.w+right.w&&bott.w>=right.w)cur.l=MAX(bott.l+right.l,MAX(top.l+bott.l,a+top.l));
                    
/**//*cur.l=MAX(cur.l,MAX(top.l,right.l)+a);*/
                    used[i]
=1;
                    saved
=cur;
                    lyot(type,tg[i].l,tg[i].w,ith
+1);
                    cur
=saved;
                    lyot(type,tg[i].w,tg[i].l,ith
+1);
                    used[i]
=0;
                    
break;
                
default :break;
                }

            
break;
            
default :break;
            }

    }

}
    
int  main()
{
    
int i,k,j;
    FILE 
*fin,*fout;
    fin
=fopen("packrec.in","r");
    fout
=fopen("packrec.out","w");
    
/**//*fin=freopen("packrec","r",stdin);
    fout=freopen("packrec","w",stdout);
*/

    
for(i=0;i<4;i++)
    
{
        fscanf(fin,
"%d%d",&k,&j);
        tg[i].l
=(k>j?k:j);
        tg[i].w
=(k<j?k:j);
    }

    
for(i=0;i<6;i++)
        
for(j=0;j<4;j++)
        
{
            used[j]
=1;
            cur.w
=0;cur.l=0;
            lyot(i,tg[j].w,tg[j].l,
1);
            cur.w
=0;cur.l=0;
            lyot(i,tg[j].l,tg[j].w,
1);
            used[j]
=0;
        }

    fprintf(fout,
"%d\n",area);
    qsort(p,ct,
sizeof(int),cmp);
    fprintf(fout,
"%d %d\n",area/p[0],p[0]);
    
for(i=1;i<ct;++i)
        
if(p[i]!=p[i-1])
            fprintf(fout,
"%d %d\n",area/p[i],p[i]);
    
return 0;
}


你可能感兴趣的:(usaco_packrec暴搜)