posted by Ryan on .
can enyone help me figure this out...
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.
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.
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.
2 3 4
1 1 1
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.
One 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
the absolute ratio is bigger than the "smallest absolute ratio so far", ignore that line,
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.
OK, 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.