/*
ID: ljracm1
LANG: C++
PROB: packrec
*/
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cstdio>
#define T
using namespace std;
int s[5],l[5],w[5],res[205],MaxArea=0x3f3f3f3f;
int x,y;//
void update(){
if(y*x<MaxArea){
MaxArea = x*y;
memset(res,0,sizeof(res));
}
if(x*y==MaxArea){
res[min(x,y)]=1;
}
}
int cal(int a,int b,int c,int d){
//case1:
x=l[a]+l[b]+l[c]+l[d];
y=max(max(w[a],w[b]), max(w[c],w[d]));
update();
//case2:
x = max(l[b]+l[c]+l[d],l[a]);
y = max( max(w[b],w[c]), w[d] )+ w[a];
update();
//case3:
x = max( l[b]+l[c]+l[d], l[a]+l[d] );
y = max( max(w[b],w[c])+w[a], w[d]);
update();
//case4:
x = l[a]+max(l[b],l[c])+l[d];
y = max( max(w[a],w[d]),w[b]+w[c] );
update();
//case5:
x = max(l[a],l[b])+l[c]+l[d];
y = max(w[a]+w[b], max(w[c],w[d]) );
update();
//case6:
x = l[a]+l[b];
y = max(w[a]+w[c], w[b]+w[d]);
if(w[a]<w[b])
x = max(x,l[c]+l[b]);
if(w[a]+w[c]>w[b])
x = max(x,l[c]+l[d]);
if(w[b]<w[a])
x = max(x,l[a]+l[d]);
x = max(x,l[c]);
x = max(x,l[d]);
update();
}
void dfs(int i,int a,int b,int c,int d){
if(i==4)cal(a,b,c,d);
else{
dfs(i+1,a,b,c,d);
swap(l[i+1],w[i+1]);
dfs(i+1,a,b,c,d);
swap(l[i+1],w[i+1]);
}
}
void solve(int a,int b,int c,int d){
dfs(0,a,b,c,d);
swap(l[0],w[0]);
dfs(0,a,b,c,d);
swap(l[0],w[0]);
}
int main(){
#ifdef T
freopen("packrec.in","r",stdin);
freopen("packrec.out","w",stdout);
#endif
for(int i=0; i<4; i++)
cin>>l[i]>>w[i];
s[0]=0; s[1]=1; s[2]=2; s[3]=3;
while(next_permutation(s,s+4))
solve(s[0],s[1],s[2],s[3]);
cout<<MaxArea<<endl;
for(int i=1; i<=200; i++){
if(res[i])
cout<<i<<" "<<MaxArea/i<<endl;
}
return 0;
}
usaco packrec
最新推荐文章于 2016-02-05 11:04:42 发布
