超级蛋疼的题 看到第一遍就不想做 拖啊拖
/* ID: Jang Lawrence PROG: packrec LANG: C++ */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> using namespace std; int Max(int x,int y){if(x<y) return y;return x;} struct ps { int l,r; ps(int _l=0,int _r=0){l=_l;r=_r;} }a[4][2],res[2200],p[4]; int ans=11111111,k; bool in[4]; void check() { int x,y; x=p[0].r+p[1].r+p[2].r+p[3].r; y=Max(Max(p[0].l,p[1].l),Max(p[2].l,p[3].l)); x*=y; if(ans>=x) {if(ans>x){ans=x;k=0;}res[k++]=ps(x/y,y);} x=Max(p[3].r,p[0].r+p[1].r+p[2].r); y=Max(p[0].l,Max(p[1].l,p[2].l))+p[3].l; x*=y; if(ans>=x) {if(ans>x){ans=x;k=0;}res[k++]=ps(x/y,y);} x=Max(p[3].r,p[0].r+p[1].r)+p[2].r; y=Max(p[2].l,Max(p[0].l,p[1].l)+p[3].l); x*=y; if(ans>=x) {if(ans>x){ans=x;k=0;}res[k++]=ps(x/y,y);} x=Max(p[1].r,p[3].r)+p[0].r+p[2].r; y=Max(Max(p[0].l,p[2].l),p[1].l+p[3].l); x*=y; if(ans>=x) {if(ans>x){ans=x;k=0;}res[k++]=ps(x/y,y);} x=Max(p[0].r,p[3].r)+p[1].r+p[2].r; y=Max(Max(p[1].l,p[2].l),p[0].l+p[3].l); x*=y; if(ans>=x) {if(ans>x){ans=x;k=0;}res[k++]=ps(x/y,y);} if(p[0].r<=p[3].r&&p[0].r+p[1].r>=p[2].r+p[3].r&&p[1].r>=p[3].r&&p[3].l>=p[2].l){ x=Max(p[2].r+p[3].r,p[0].r+p[1].r); y=Max(p[0].l+p[2].l,p[1].l+p[3].l); x*=y; if(ans>=x) {if(ans>x){ans=x;k=0;}res[k++]=ps(x/y,y);} } } void dfs(int n) { if(n==4) { check(); return ; } for(int i=0;i<=3;++i) if(!in[i]) { in[i]=1; for(int j=0;j<2;++j) { p[n]=a[i][j]; dfs(n+1); } in[i]=0; } } bool is[119][110]; int main() { #ifndef DEBUG freopen("packrec.in","r",stdin); freopen("packrec.out","w",stdout); #endif for(int i=0;i<4;++i) { int x,y; scanf("%d%d",&x,&y); a[i][0]=ps(x,y); a[i][1]=ps(y,x); } dfs(0); printf("%d\n",ans); for(int i=0;i<k;++i) is[res[i].l][res[i].r]=is[res[i].r][res[i].l]=1; for(int i=1;i*i<=ans;++i) if(ans%i==0&&is[i][ans/i]) printf("%d %d\n",i,ans/i); return 0; }