2013-06-29 22:21:02Morris
[UVA] 11834 - Elevator
Elevator
The FCC (Factory of Cylinders of Carbon) manufactures various types of
cylinders of carbon. FCC is installed on the tenth floor of a building,
and uses the several building's elevators
to transport the cylinders. For security, the cylinders must be
transported in the upright position, and since they are heavy, at most
two cylinders can be transported in a single elevator
ride. The elevators have the shape of a parallelepiped and their height
is always greater than
the height of the cylinders.
Elevator |
To minimize the number of elevator trips to transport the cylinders, the FCC wants, whenever possible, to put two cylinders in the elevator. The figure below illustrates, schematically (top view) a case where this is possible (a), and a case where this is not possible (b):
As there is a very large amount of elevators and types of cylinders, FCC hired you to write a program that, given the dimensions of the elevator and of the two cylinders, determines whether it is possible to put the two cylinders in the elevator.
Input
The input contains several test cases. The first and only line of each test case contains four integers L, C, R1 and R2 , separated by blanks, indicating the width ( 1L100) and the length ( 1C100) of the elevator and the radii of the cylinders ( 1R1, R2100).The last test case is followed by a line containing four zeros separated by blanks.
Output
For each test case your program should print a single line with a single character, `S' if you can put the two cylinders in the elevator and `N' otherwise.
Sample Input
11 9 2 3 7 8 3 2 10 15 3 7 8 9 3 2 0 0 0 0
Sample Output
S N N S
題目解法:
基本上思考一下, 要讓這兩個圓塞進矩形中, 不一定是要公切於邊。
但有個原則一定可行, 兩個圓剛好放在兩個對角的角落,
如果這兩個圓還是外離, 便一定可行, 因此將圖形座標化就可以解了。
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
int main() {
double L, C, R1, R2;
while(scanf("%lf %lf %lf %lf", &L ,&C, &R1, &R2) == 4) {
if(L+C+R1+R2 == 0) break;
// (x-R1)^2 + (y-R1)^2 = R1^R1
// (x-(L-R2))^2 + (y-(C-R2))^2 = R2^R2
double x1, x2, y1, y2;
x1 = R1, y1 = R1;
x2 = L-R2, y2 = C-R2;
double a = R1, b = R2, c = sqrt(pow(x1-x2,2)+pow(y1-y2,2));
if(a+b <= c + 1e-6 && R1+R1 <= L && R1+R1 <= C && R2+R2 <= L && R2+R2 <= C)
puts("S");
else
puts("N");
}
return 0;
}