我们如何算法计算最大可能容量的盒子?

时间:2012-12-05 22:04:33

标签: algorithm

  

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”。我不想要这个代码。我想知道的是我们如何解决这个问题?任何帮助,将不胜感激。提前谢谢。

4 个答案:

答案 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度,短轴沿着同一条线。此外:

  1. 中心位于(P/12,P/12,P/12)
  2. 半径为r = Sqrt(P^2/16-S - 3(P/12)^2)=Sqrt(P^2/24-S)
  3. 圆圈位于垂直于(1,1,1)
  4. 的平面图中

    因此,如果我们在圆上有一个点,它将相对于(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个方程如下:

  1. yz = L1 + L2 *(y + z)
  2. xz = L1 + L2 *(x + z)
  3. xy = L1 + L2 *(x + y)
  4. x + y + z = p
  5. xy + yz + xy = s
  6. 然后用一点点数学,你会发现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)