DIY手工

题目大意:H 小姐的生日很快就要到了,小 Z 还在思索应该送 H 小姐什么生日礼物才好。送化妆品太贵,送巧克力又太俗了……突然,小 Z 灵机一动,打算做一个 diy 手工以显诚意。

小 Z 找来了好多长度为 N 的冰棒棍,他打算把这些冰棒棍切割成若干段,然后拼接成一个个长方体,然后再用这些长方体垒成城堡。然而,小 Z 却开始为长方体长宽高的选取而烦恼:设长方体的长宽高分别为 L,W,H,为了更好地利用这些长度为 N 的冰棒棍,小 Z 希望把这些冰棒棍分为四组,其中第一组都能恰好切割成若干段长(L 整除 N),第二组切割成若干段宽(W 整除 N),第三组切割成若干段高(H 整除 N),最后一组恰好切割成长宽高各一段(N=L+W+H)。现在,小 Z 好奇,拼成的长方体,体积最大是多少?

H小姐。。。

简化题面:在n中找三个约数a,b,c,使得a+b+c=n,求max(abc)=?

显然是个找规律的题目,考虑\(n\leq 2\)肯定不合适

所以继续拓展,\(n=3\)(1,1,1)可以,\(n=4\)(1,1,2)可以,\(n=5\)不可以,\(n=6\)(2,2,2)3的倍数,当然可以

以此类推,素数显然不合适,然后就可以发现,如果一个数字不是3的倍数也不是4的倍数,那么他一定不合适,3的倍数平均分,4的倍数1,1,2

代码如下:

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
26
27
28
#include <bits/stdc++.h>
#define ll long long
using namespace std;

int T, n;

inline ll solve(int x)
{
if (x <= 2) return -1;
if (x % 3 != 0 && x % 4 != 0) return -1;
if (x % 3 == 0) return 1ll * x / 3 * x / 3 * x / 3;
return 1ll * x / 2 * x / 4 * x/ 4;
}

signed main()
{
T = read();
while (T --)
{
n = read();
put(solve(n));
}
return 0;
}
/*
在n中找三个约数a,b,c,使得a+b+c=n
求max(a*b*c)=?
*/

总结:

这次考试期望得分:60+70+?=130pts

实际得分:30+100+0=130pts

世事难料,却又是如此巧妙

第一题没开ll挂了三十分,第二题写个暴力调都没调直接压正解

第三题?神仙?