Packing Rectangles(USACO)

/* ID:tianlin2 PROG:packrec LANG:C++ */ #include <iostream> #include <fstream> #define INF 32768 using namespace std; class rect { public: int x; int y; int area; rect() { x=0; y=0; area=0; } rect operator=(rect a) { x=a.x; y=a.y; area=a.area; return *this; } }; void bubble(rect a[],int n) { int b=0; while(!b){ b=1; for(int i=0;i!=n-1;++i){ if(a[i].x>a[i+1].x){ rect temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; b=0; } } } } int max(int a,int b,int c) { if(a>=b&&a>=c) return a; else if(b>=a&&b>=c) return b; else if(c>=a&&c>=b) return c; } int max(int a,int b) { if(a>b) return a; return b; } int states[24]={1234,1243,1324,1342,1423,1432,2134,2143,2314,2341,2413,2431,3124,3142,3214,3241,3412,3421,4123,4132,4213,4231,4312,4321}; int states3[6]={123,132,213,231,312,321}; rect re[4]; //长x,短y void chan(int& w,int& h,int s) { w=re[s].x; h=re[s].y; } void swap(int &a,int &b) { int temp=a; a=b; b=temp; } int main() { ifstream fin("packrec.in"); ofstream fout("packrec.out"); int mycount=0; int minar=INF; int count=0; for(int i=0;i!=4;++i){ fin>>re[i].x>>re[i].y; if(re[i].x<re[i].y){ int temp=re[i].x; re[i].x=re[i].y; re[i].y=temp; } } bubble(re,4); rect minre[200]; int area=0; int miny=re[0].y+re[1].y+re[2].y+re[3].y; int minx=re[3].x; if(minx<miny){ int temp=minx; minx=miny; miny=temp; } area=minx*miny; if(area<minar){ minar=area; minre[miny%INF].x=minx; minre[miny%INF].y=miny; minre[miny%INF].area=minar; mycount=1; } minx=re[0].x+re[1].x+re[2].x+re[3].x; miny=max(max(re[0].y,re[1].y,re[2].y),re[3].y); if(minx<miny) swap(minx,miny); area=minx*miny; if(area<minar){ minar=area; minre[miny%INF].x=minx; minre[miny%INF].y=miny; minre[miny%INF].area=minar; mycount=1; } else if(area==minar&&minre[miny%INF].area!=minar){ minre[miny%INF].x=minx; minre[miny%INF].y=miny; minre[miny%INF].area=minar; ++mycount; } for(int i=0;i!=6;++i){ int s,s1,s2,s3; s=states3[i]; s3=s%10; s/=10; s2=s%10; s/=10; s1=s%10; for(int i1=0;i1!=2;++i1){ int w1,h1; if(i1) chan(w1,h1,s1-1); else chan(h1,w1,s1-1); for(int i2=0;i2!=2;++i2){ int w2,h2; if(i2) chan(w2,h2,s2-1); else chan(h2,w2,s2-1); for(int i3=0;i3!=2;++i3){ int w3,h3; if(i3) chan(w3,h3,s3-1); else chan(h3,w3,s3-1); int minw2=max(w1+w2+w3,re[3].x); int minh2=max(h1,h2,h3)+re[3].y; if(minw2<minh2) swap(minw2,minh2); int minar2=minw2*minh2; if(minar2<minar){ minar=minar2; minre[minh2%INF].x=minw2; minre[minh2%INF].y=minh2; minre[minh2%INF].area=minar; mycount=1; } else if(minar2==minar&&minre[minh2%INF].area!=minar){ minre[minh2%INF].x=minw2; minre[minh2%INF].y=minh2; minre[minh2%INF].area=minar; mycount++; } } } } } for(int i=0;i!=24;++i){ int s,s1,s2,s3,s4; s=states[i]; s4=s%10; s/=10; s3=s%10; s/=10; s2=s%10; s/=10; s1=s%10; for(int i1=0;i1!=2;++i1){ int w1,h1; if(i1) chan(w1,h1,s1-1); else chan(h1,w1,s1-1); for(int i2=0;i2!=2;++i2){ int w2,h2; if(i2) chan(w2,h2,s2-1); else chan(h2,w2,s2-1); for(int i3=0;i3!=2;++i3){ int w3,h3; if(i3) chan(w3,h3,s3-1); else chan(h3,w3,s3-1); for(int i4=0;i4!=2;++i4){ int w4,h4; if(i4) chan(w4,h4,s4-1); else chan(h4,w4,s4-1); int minw3=max(w1+w2,w3)+w4; int minh3=max(h1+h3,h2+h3,h4); if(minw3<minh3) swap(minw3,minh3); int minar3=minw3*minh3; int minw4=w1+w2+max(w3,w4); int minh4=max(h1,h2,h3+h4); if(minw4<minh4) swap(minw4,minh4); int minar4=minw4*minh4; int minw5; int minh5=max(h1+h3,h2+h4); if(h3>=h2+h4) minw5=max(w1,w3+w2,w3+w4); else if(h3>h4&&h3<h2+h4) minw5=max(w1+w2,w3+w2,w3+w4); else if(h4>h3&&h4<h3+h1) minw5=max(w1+w2,w4+w1,w4+w3); else if(h4>=h1+h3) minw5=max(w2,w4+w1,w4+w3); else if(h4==h3) minw5=max(w1+w2,w3+w4); if(minw5<minh5) swap(minw5,minh5); int minar5=minw5*minh5; if(minar3<=minar4&&minar3<=minar5&&minar3<=minar){ if(minar3!=minar){ minar=minar3; minre[minh3%INF].x=minw3; minre[minh3%INF].y=minh3; minre[minh3%INF].area=minar; mycount=1; if(minar3==minar4&&minh3!=minh4){ minre[minh4%INF].x=minw4; minre[minh4%INF].y=minh4; minre[minh4%INF].area=minar; mycount++; } if(minar3==minar5&&minh5!=minh3){ minre[minh5%INF].x=minw5; minre[minh5%INF].y=minh5; minre[minh5%INF].area=minar; mycount++; } } else{ if(minre[minh3%INF].area!=minar){ minre[minh3%INF].area=minar; minre[minh3%INF].x=minw3; minre[minh3%INF].y=minh3; mycount++; } if(minar3==minar4&&minre[minh4%INF].area!=minar){ minre[minh4%INF].area=minar; minre[minh4%INF].x=minw4; minre[minh4%INF].y=minh4; mycount++; } if(minar3==minar5&&minre[minh5%INF].area!=minar){ minre[minh5%INF].x=minw5; minre[minh5%INF].y=minh5; minre[minh5%INF].area=minar; mycount++; } } } else if(minar4<=minar3&&minar4<=minar5&&minar4<=minar){ if(minar4!=minar){ minar=minar4; minre[minh4%INF].x=minw4; minre[minh4%INF].y=minh4; minre[minh4%INF].area=minar; mycount=1; if(minar3==minar4&&minh3!=minh4){ minre[minh3%INF].x=minw3; minre[minh3%INF].y=minh3; minre[minh3%INF].area=minar; mycount++; } if(minar4==minar5&&minh5!=minh4){ minre[minh5%INF].x=minw5; minre[minh5%INF].y=minh5; minre[minh5%INF].area=minar; mycount++; } } else{ if(minre[minh4%INF].area!=minar){ minre[minh4%INF].area=minar; minre[minh4%INF].x=minw4; minre[minh4%INF].y=minh4; mycount++; } if(minar3==minar4&&minre[minh3%INF].area!=minar){ minre[minh3%INF].area=minar; minre[minh3%INF].x=minw3; minre[minh3%INF].y=minh3; mycount++; } if(minar4==minar5&&minre[minh5%INF].area!=minar){ minre[minh5%INF].x=minw5; minre[minh5%INF].y=minh5; minre[minh5%INF].area=minar; mycount++; } } } else if(minar5<=minar3&&minar5<=minar4&&minar5<=minar){ if(minar5!=minar){ minar=minar5; minre[minh5%INF].x=minw5; minre[minh5%INF].y=minh5; minre[minh5%INF].area=minar; mycount=1; if(minar3==minar5&&minh3!=minh5){ minre[minh3%INF].x=minw3; minre[minh3%INF].y=minh3; minre[minh3%INF].area=minar; mycount++; } if(minar4==minar5&&minh5!=minh4){ minre[minh4%INF].x=minw4; minre[minh4%INF].y=minh4; minre[minh4%INF].area=minar; mycount++; } } else{ if(minre[minh5%INF].area!=minar){ minre[minh5%INF].area=minar; minre[minh5%INF].x=minw5; minre[minh5%INF].y=minh5; mycount++; } if(minar3==minar5&&minre[minh3%INF].area!=minar){ minre[minh3%INF].area=minar; minre[minh3%INF].x=minw3; minre[minh3%INF].y=minh3; mycount++; } if(minar4==minar5&&minre[minh4%INF].area!=minar){ minre[minh4%INF].x=minw4; minre[minh4%INF].y=minh4; minre[minh4%INF].area=minar; mycount++; } } } } } } } } fout<<minar<<endl; int endcount=0; for(int hi=0;hi!=INF&&endcount!=mycount;++hi){ if(minre[hi].area==minar){ ++endcount; fout<<minre[hi].y<<' '<<minre[hi].x<<endl; } } //system("pause"); return 0; } 

转载于:https://www.cnblogs.com/cyxcw1/archive/2010/08/06/3051327.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值