Johnny需要为他的物理课项目制作一个矩形框。他买了P厘米的电线和S cm2的特殊纸。他想用所有的电线(12个边缘)和纸张(6个边)制作盒子。
Johnny可以制作的最大音量是多少?
输入
第一行包含t,测试用例数(约10)。然后是t测试案例。 每个测试用例在一行中包含两个整数P和S(1≤P≤40000,1≤S≤20000)。您可以假设对于给定的输入案例总是存在最佳解决方案。
输出
对于每个测试用例,打印一个实数,该数字是Johnny可以制作的最大音量,四舍五入到小数点后两位。
示例输入:
2
20 14
20 16
输出:
3.00
4.15
输出详情
第一种情况:最大框的尺寸可以是3,1和1.
第二种情况:最大盒子的尺寸可能是7 / 3,4 / 3和4/3。
这是来自www.codechef.com的练习题。名称是“The Best box”。我不想要这个代码。我想知道的是我们如何解决这个问题?任何帮助,将不胜感激。提前谢谢。
答案 0 :(得分:5)
您实际上是在尝试解决:
maximize V=a*b*c
subject to constraints:
4a+4b+4c = P
2ab + 2ac + 2bc = S
这是一个可以使用lagrange multipliers解决的数学问题(将其余部分留给你作为练习 - 它主要是技术性的,如果做得很慢,应该小心,应该不是问题)。 / p>
答案 1 :(得分:2)
只是为了好玩,这是一个无微积分的答案。
考虑到约束条件:
4a+4b+4c = P
2ab + 2ac + 2bc = S
我们可以将这些重写为:
a+b+c = P/4
(a+b+c)^2 - (a^2+b^2+c^2) = S
或
a+b+c = P/4
a^2+b^2+c^2 = P^2/16 - S
换句话说:解决方案位于切割P/4
处主轴的平面与半径为P^2/16-S
的原点居中的球体的交点处。这个交叉点是一个圆圈。从上面看它,它看起来像一个椭圆,其中心与原点成45度,短轴沿着同一条线。此外:
(P/12,P/12,P/12)
。 r = Sqrt(P^2/16-S - 3(P/12)^2)=Sqrt(P^2/24-S)
。(1,1,1)
因此,如果我们在圆上有一个点,它将相对于(da,db,dc)
的中心有一个位移。由于3.,我们知道dc = -da - db
。此外,平方和必须等于半径的平方,所以:
r^2 = da^2 + db^2 + (da+db)^2
= 2(da^2 + db^2 + da db)
现在,位移是圆的线性变换,因此我们可以按如下方式对其进行参数化:
dc = -2A cos t
da = A cos t + B sin t
db = A cos t - B sin t
要求(da,db,dc)
的长度为r
,我们得到:
da^2 + db^2 + dc^2
= A^2 cos^2 t + B^2 sin^2 t + 2AB cos t sin t
+ A^2 cos^2 t + B^2 sin^2 t - 2AB cos t sin t
+ 4A^2 cos^2 t
= 6A^2 cos^2 t + 2B^2 sin^2 t
为了使其独立于t
,我们必须6A^2 = 2B^2 = r^2
,所以
A = r / sqrt(6)
B = r / sqrt(2)
等等
da = r/sqrt(6) cos t + r/sqrt(2) sin t
db = r/sqrt(6) cos t - r/sqrt(2) sin t
,音量变为
V = (P/12 + da)(P/12 + db)(P/12 - da - db)
= P^3/1728 + (da db - da(da + db) - db(da + db))P/12 - da db (da + db)
= P^3/1728 - (da^2 + db^2 + da db)P/12 - da db (da + db)
= P^3/1728 - P r^2/24 - da db (da + db)
= C - (r^2/6 cos^2 t - r^2/2 sin^2 t) 2 r/sqrt(6) cos t
= C - r^3 sqrt(6)/18 (cos^2 t - 3 sin^2 t) cos t
= C - D (4 cos^2 t - 3 cos^2 t - 3 sin^2 t) cos t
= C - D (4 cos^3 t - 3 cos t)
= C - D cos 3t
其中C和D为正数。显然,当cos 3t
为-1
时达到最大值,在这种情况下,音量为:
V = P^3/1728 - P(P^2/24-S)/24 + Sqrt(P^2/24-S)^3 Sqrt(6)/18
答案 2 :(得分:0)
使用具有多个约束的Lagrange Multiplier。 f(x,y,z)= xzy - L1 * g(x,y,z) - L2 * h(x,y,z)其中g(x,y,z)= x + y + zP / 4和h (x,y,z)= xy + yz + xz-S / 2
然后你做df / dx = 0,df / dy = 0,df / dz = 0,df / dL1 = 0,df / dL2 = 0,你将得到5个方程如下:
然后用一点点数学,你会发现x = y = L2从1 2和3.然后z = p - 2 * L2从4和z =(s - 2 * L2 ^ 2)/ 2 *从5开始的L2现在你可以从上面两个方程中计算出L2的值(还记得二次方程吗?)。并且体积是V = xyz = L2 * L2 *(p-2 * L2)
答案 3 :(得分:-1)
假设您在codechef.com/problems/J7
处遇到问题python 2.7中的解决方案是
T = int(input())
for i in range(T):
P = raw_input().split()
S = int(P[1])
P = int(P[0])
V = (P**3)/1728.00 - P*( (P**2)/24.00-S)/24.00 + (((P**2)/24.00-S)**1.5)*(6**0.5)/18
print("%.2f"%V)