USACO packrec

来源:互联网 发布:淘宝开店必胜100法pdf 编辑:程序博客网 时间:2024/05/06 19:06
/*ID: jinusac1PROG: packrecLANG: 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;}

0 0
原创粉丝点击