/*
ID: jinusac1
PROG: packrec
LANG: C++
*/
#include <fstream>
#include <algorithm>
using namespace std;
struct REC{
int c,k;
}rec[5],r[2500],t[5];
int num[10],Min=20000,c=0;
ifstream fin("packrec.in");
ofstream fout("packrec.out");
bool cmp(struct REC a,struct REC b)
{
return a.k<b.k;
}
void judge(int s,int a,int b)
{
if(s==Min){
if(a>b) {r[c].c=a;r[c].k=b;}
else {r[c].k=a;r[c].c=b;}
c++;
}
else if(s<Min){
c=0;
Min=s;
if(a>b) {r[c].c=a;r[c].k=b;}
else {r[c].k=a;r[c].c=b;}
c++;
}
}
void six(int a,int b)
{
if(t[num[1]].k>t[num[2]].k) return ;
a=t[num[2]].k+t[num[3]].k;
b=t[num[1]].c+t[num[2]].c;
if(t[num[3]].c<t[num[2]].c){
if(t[num[4]].c>t[num[3]].k) return ;
if((t[num[4]].k+t[num[3]].c)>b) b=t[num[4]].k+t[num[3]].c;
judge(a*b,a,b);return ;
}
else{
if(t[num[3]].c<b){
if(t[num[4]].c>(t[num[3]].k+t[num[2]].k-t[num[1]].k)) return ;
if((t[num[4]].k+t[num[3]].c)>b) b=t[num[4]].k+t[num[3]].c;
judge(a*b,a,b);return ;
}
else{
if(t[num[4]].c>a) a=t[num[4]].c;
if((t[num[4]].k+t[num[3]].c)>b) b=t[num[4]].k+t[num[3]].c;
judge(a*b,a,b);return ;
}
}
}
void dfs(int i)
{
if(i==5){
int a=0,b=0;
for(int j=1;j<=4;j++){
a+=t[j].k;
if(t[j].c>b) b=t[j].c;
num[j]=j;
}
judge(a*b,a,b);
for(int j=1;j<=24;j++){
a=b=0;
a=((t[num[1]].k+t[num[2]].k+t[num[3]].k)>t[num[4]].c?(t[num[1]].k+t[num[2]].k+t[num[3]].k):t[num[4]].c);
b=t[num[1]].c>t[num[2]].c?t[num[1]].c:t[num[2]].c;
b=(b>t[num[3]].c?b:t[num[3]].c)+t[num[4]].k;
judge(a*b,a,b);
a=b=0;
a=((t[num[1]].k+t[num[2]].k)>t[num[4]].c?(t[num[1]].k+t[num[2]].k):t[num[4]].c)+t[num[3]].k;
b=(t[num[1]].c>t[num[2]].c?t[num[1]].c:t[num[2]].c)+t[num[4]].k;
if(t[num[3]].c>b) b=t[num[3]].c;
judge(a*b,a,b);
a=b=0;
a=(t[num[2]].k>t[num[3]].k?t[num[2]].k:t[num[3]].k)+t[num[1]].k+t[num[4]].k;
b=t[num[1]].c>t[num[4]].c?t[num[1]].c:t[num[4]].c;
if((t[num[2]].c+t[num[3]].c)>b) b=t[num[2]].c+t[num[3]].c;
judge(a*b,a,b);
six(0,0);
next_permutation(num+1,num+5);
}
return ;
}
t[i].c=rec[i].c;
t[i].k=rec[i].k;
dfs(i+1);
t[i].c=rec[i].k;
t[i].k=rec[i].c;
dfs(i+1);
}
int main()
{
for(int i=1;i<=4;i++) fin>>rec[i].k>>rec[i].c;
dfs(1);
sort(r,r+c,cmp);
fout<<Min<<endl;
for(int i=0;i<c;i++){
fout<<r[i].k<<" "<<r[i].c<<endl;
while(i<c&&(r[i+1].c==r[i].c&&r[i+1].k==r[i].k)) i++;
}
return 0;
}
USACO packrec
最新推荐文章于 2016-02-05 11:04:42 发布