USACO 1.4 Packing Rectangles

 
  
1 /*
2 ID: ******
3 PROG: packrec
4 LANG: C++
5   */
6 #include < iostream >
7 #include < fstream >
8 #include < algorithm >
9 #include < string >
10 #include < vector >
11 using namespace std;
12
13 #define maxN(x,y) ((x)>(y)?(x):(y))
14
15 struct rec
16 {
17 int wid;
18 int highet;
19 int squre;
20 rec( int w, int h)
21 {
22 if (w > h)
23 {
24 int temp = w ;
25 w = h;
26 h = temp;
27 }
28 highet = h;
29 wid = w;
30 squre = w * h;
31 }
32 rec(){}
33 void swap()
34 {
35 int temp = wid;
36 wid = highet;
37 highet = temp;
38 }
39 };
40 bool compare( const rec & r1, const rec & r2)
41 {
42 if (r1.squre != r2.squre)
43 return r1.squre < r2.squre;
44 else
45 return r1.wid < r2.wid;
46 }
47 rec v[ 4 ];
48 vector < rec > res;
49 int have[ 4 ];
50 int main()
51 {
52 ofstream fout ( " packrec.out " );
53 ifstream fin ( " packrec.in " );
54
55 have[ 0 ] = 1 ;
56 have[ 1 ] = 1 ;
57 have[ 2 ] = 1 ;
58 have[ 3 ] = 1 ;
59 for ( int i = 0 ; i != 4 ; ++ i)
60 {
61 int tw,th;
62 fin >> tw >> th;
63 // if(tw>th)
64 // {
65 // int temp = tw;
66 // tw = th;
67 // th = temp;
68 // }
69 v[i].wid = tw;
70 v[i].highet = th;
71 }
72
73 for ( int r1 = 0 ;r1 != 4 ; ++ r1)
74 {
75 have[r1] = 0 ;
76 for ( int r2 = 0 ;r2 != 4 ; ++ r2)
77 {
78 if ( ! have[r2]) continue ;
79 have[r2] = 0 ;
80 for ( int r3 = 0 ;r3 != 4 ; ++ r3)
81 {
82 if ( ! have[r3]) continue ;
83 have[r3] = 0 ;
84 for ( int r4 = 0 ;r4 != 4 ; ++ r4)
85 {
86 if ( ! have[r4]) continue ;
87 for ( int r1s = 0 ;r1s != 2 ; ++ r1s,v[r1].swap())
88 for ( int r2s = 0 ;r2s != 2 ; ++ r2s,v[r2].swap())
89 for ( int r3s = 0 ;r3s != 2 ; ++ r3s,v[r3].swap())
90 for ( int r4s = 0 ;r4s != 2 ; ++ r4s,v[r4].swap())
91 {
92 int w2;
93 int h2;
94 w2 = v[r1].wid + v[r2].wid + v[r3].wid + v[r4].wid;
95 h2 = maxN(maxN(maxN(v[r1].highet,v[r2].highet),v[r3].highet),v[r4].highet);
96 res.push_back(rec(w2,h2));
97
98 w2 = v[r2].wid + v[r3].wid + v[r4].wid;
99 h2 = maxN(v[r2].highet,maxN(v[r3].highet,v[r4].highet));
100 h2 += v[r1].wid;
101 w2 = maxN(w2,v[r1].highet);
102 res.push_back(rec(w2,h2));
103
104 w2 = v[r1].wid + maxN(v[r2].highet,v[r3].wid + v[r4].wid);
105 h2 = maxN(v[r1].highet,v[r2].wid + maxN(v[r3].highet,v[r4].highet));
106 res.push_back(rec(w2,h2));
107
108 w2 = v[r1].wid + v[r2].wid + maxN(v[r3].wid,v[r4].wid);
109 h2 = maxN(v[r3].highet + v[r4].highet,maxN(v[r1].highet,v[r2].highet));
110 res.push_back(rec(w2,h2));
111
112 h2 = max(v[r1].highet + v[r3].highet,v[r2].highet + v[r4].highet);
113 if (v[r3].highet >= v[r2].highet + v[r4].highet)
114 w2 = max(v[r1].wid,v[r3].wid + max(v[r2].wid,v[r4].wid));
115 if (v[r3].highet > v[r4].highet && v[r3].highet < v[r2].highet + v[r4].highet)
116 w2 = max(v[r1].wid + v[r2].wid,v[r3].wid + max(v[r2].wid,v[r4].wid));
117 if (v[r3].highet < v[r4].highet && v[r4].highet < v[r1].highet + v[r3].highet)
118 w2 = max(v[r1].wid + v[r2].wid,v[r4].wid + max(v[r1].wid,v[r3].wid));
119 if (v[r4].highet >= v[r1].highet + v[r3].highet)
120 w2 = max(v[r2].wid,v[r4].wid + max(v[r1].wid,v[r3].wid));
121 if (v[r3].highet == v[r4].highet)
122 w2 = max(v[r1].wid + v[r2].wid,v[r3].wid + v[r4].wid);
123
124 res.push_back(rec(w2,h2));
125 }
126 }
127 have[r3] = 1 ;
128 }
129 have[r2] = 1 ;
130 }
131
132 have[r1] = 1 ;
133 }
134
135 sort(res.begin(),res.end(),compare);
136
137 int minNum = res[ 0 ].squre;
138
139 int lastW = 0 ;
140 fout << minNum << endl;
141 for (vector < rec > ::iterator i = res.begin();
142 i != res.end(); ++ i)
143 {
144 if (i -> squre != minNum) break ;
145 if (lastW == i -> wid) continue ;
146 lastW = i -> wid;
147 fout << i -> wid << " " << i -> highet << endl;
148 }
149 fin.close();
150 fout.close();
151 return 0 ;
152 }
153
154

转载于:https://www.cnblogs.com/huanyan/archive/2011/05/02/USACO_Packing_Rectangles.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值