洛谷1212手动枚举各种情况(缩代码成瘾)

既然图都给了,只要讨论清楚就可以了

——疯狂压代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int ans=50000,X,Y;int x[5],y[5],p[5],q[5],a[201];bool b[5];
 4 void check(){if(X*Y<=ans)ans=X*Y,a[min(X,Y)]=max(X,Y);}
 5 void get(int k){X=0;Y=0;for(int i=1;i<=k;i++)X+=p[i],Y=max(Y,q[i]);}
 6 void dfs(int k){
 7     if(k>4){
 8         get(4);check();
 9         get(3);Y+=q[4];X=max(X,p[4]);check();
10         get(2);Y=max(Y+q[3],q[4]);X=max(X,p[3])+p[4];check();
11         get(2);X+=max(p[3],p[4]);Y=max(q[3]+q[4],Y);check();
12         if(p[1]<=p[2] && ((q[3]>=q[1]+q[2])&&(p[4]<=p[2]+p[3])||(q[3]>=q[2])&&(p[1]+p[4]<=p[2]+p[3])))
13             X=p[2]+p[3],Y=max(q[1]+q[2],q[3]+q[4]),check();
14         return;
15     }
16     for(int i=1;i<=4;i++)
17         if(!b[i])p[k]=x[i],q[k]=y[i],b[i]=1,dfs(k+1),swap(p[k],q[k]),dfs(k+1),b[i]=0;
18 }
19 int main()
20 {
21     for(int i=1;i<=4;i++) scanf("%d%d",&x[i],&y[i]);
22     dfs(1);printf("%d
",ans);
23     for(int i=1;i<=200;i++)
24         if(a[i]*i==ans)printf("%d %d
",i,a[i]);
25     return 0;
26 }
原文地址:https://www.cnblogs.com/wanglichao/p/5986046.html