题目大意

给定一张w*h大小的纸片,要求裁剪出一个a*b*c的长方体的展开图,问是否可行。

题目分析

长方体展开图共有11种情况,分别算出每种情况所需要的长宽,然后枚举验证即可。

P.S. 小学奥数题的升级版。一开始用蛮力想象展开图平起来后的边的情况。但毕竟自己的空间想象能力并不是很强,而且这样很费时,所以并不是好的做法。其实只要在展开图中根据相邻关系标上边的长度即可。

P.S. opentrain的测试数据很弱,集训时1A。回来交CF,WA了第40个点。改了一个小时后,WA第55个点。原来自己的next_permutation用在了原边长数组上,犯了一个低级错误。

source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <cstdio>
#include <algorithm>
using namespace std;
int A[3],inx[3]={0,1,2};
trueint w, h;
bool comp(int a, int b) {
trueif (a <= w && b <= h) return true;
trueif (b <= w && a <= h) return true;
truereturn false;
}
int main() {
truefor (int i = 0; i < 3; i++) scanf("%d", A + i);
true
truescanf("%d%d", &w, &h);
truebool find = false;
truedo {
truetrueint a = A[inx[0]], b= A[inx[1]], c = A[inx[2]];
truetrueif (comp(2*(a+c), b + 2 * c)||
truetruetruecomp(3*b+a+c,a+c)||
truetruetruecomp(a+b+c,a+b+2*c)||
truetruetruecomp(a+b+c,2*b+2*c)||
truetruetruecomp(a+2*b+c,a+2*c)) find = true;
true}while (!find && next_permutation(inx, inx + 3));
trueputs(find?"Yes":"No");
}