USACO packrec

/*
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值