Tuesday

July 7, 2015

July 7, 2015

Posted by **Ryan** on Tuesday, October 27, 2009 at 2:05am.

Surface to Volume Ratio

Write a program to compute surface to volume ratio. We will be given the height, width, and depth of N cuboid, and determine the smallest surface to volume ratio among them.

Input

The first line of the input data consists of N, where 0 < N <= 1000. The next N lines contain the height, width, and depth of each cuboid. All the dimensions are between 1 and 50.

Output

You should output the smallest surface to volume ratio as "a/b". This number must be simplified, that is, a and b must be prime to each other.

Sample input

2

2 3 4

1 1 1

Sample output

13/6

Hint: You may find the following recursive definition of greatest common divisor (gcd) useful. Let a >Άκ > 0. If the reminder of dividing a by b is 0, then of course the gcd of a and b is b. If the reminder is non-zero number c, then the gcd of and b is equal to the gcd of b and c.

- programming language -
**jim**, Tuesday, October 27, 2009 at 9:11amOne approach, simple but with a caveat or two:

You need a double for "smallest absoulte ratio so far". Initialise it to something very big.

As you take in each line,

a) calculate the surface and the volume as two integers

b) calculate the absolute ratio as a double

c) if

the absolute ratio is bigger than the "smallest absolute ratio so far", ignore that line,

else

store your new "smallest absolute ratio so far" and the surface and volume integers

At end, reduce your two integers to their lowest terms by calculating out their prime factors and dividing by the ones they have in common.

Technically, there's a potential gotcha in using a double, since it's possible that two ratios are so close that a double doesn't have enough precision to distinguish between them. However, with dimensions only up to 50, I think you'll be safe.

Afterthought: the input could contain two identical lines, or lines that end up with identical answers, and if I were writing the test, I surely would put such identical lines in! That's OK, because the answer is the same.

- programming language -
**jim**, Tuesday, October 27, 2009 at 9:22amOK, my conscience nags me about that double.

To do it right, then instead of taking the lazy way of converting to doubles, and comparing, then:

if your current smallest is, say, 13/6

and your new line is, say, 27/13

you should do the comparison by finding a common denominator. You don't have to waste CPU cycles on finding the lowest; just multiply the denominators:

13 / 6 = 169 / 78

27 / 13 = 162 / 78

and then compare your numerators to test which is smaller.