URI Online Judge | 1124
Timelimit: 1
Elevador
Maratona de Programação da SBC
Brasil

A FCC (Fábrica de Cilindros de Carbono) fabrica vários tipos de cilindros de carbono. A FCC está instalada no décimo andar de um prédio, e utiliza os vários elevadores do prédio para transportar os cilindros. Por questão de segurança, os cilindros devem ser transportados na posição vertical; como são pesados, no máximo dois cilindros podem ser transportados em uma única viagem de elevador. Os elevadores têm formato de paralelepípedo e sempre têm altura maior que a altura dos cilindros.
Para minimizar o número de viagens de elevador para transportar os cilindros, a FCC quer, sempre que possível, colocar dois cilindros no elevador. A figura abaixo ilustra, esquematicamente (vista superior), um caso em que isto é possível (a), e um caso em que isto não é possível (b):
Para minimizar o número de viagens de elevador para transportar os cilindros, a FCC quer, sempre que possível, colocar dois cilindros no elevador. A figura abaixo ilustra, esquematicamente (vista superior), um caso em que isto é possível (a), e um caso em que isto não é possível (b):

Como existe uma quantidade muito grande de elevadores e de tipos de cilindros, a FCC quer que você escreva um programa que, dadas as dimensões do elevador e dos dois cilindros, determine se é possível colocar os dois cilindros no elevador.
Entrada
A entrada contém vários casos de teste. A primeira e única linha de cada caso de teste contém quatro números inteiros L, C, R1 e R2, separados por espaços em branco, indicando respectivamente a largura do elevador (1 ≤ L ≤ 100), o comprimento do elevador (1 ≤ C ≤ 100), e os raios dos cilindros (1 ≤ R1, R2 ≤ 100).
O último caso de teste é seguido por uma linha que contém quatro zeros separados por espaços em branco.
O último caso de teste é seguido por uma linha que contém quatro zeros separados por espaços em branco.
Saída
Para cada caso de teste, o seu programa deve imprimir uma única linha com um único caractere: ‘S’ se for possível colocar os dois cilindros no elevador e ‘N’ caso contrário.
#include <bits/stdc++.h>
#define PI 3.14159265
using namespace std;
int cabemdiagonal(int l, int c, int r1, int r2)
{
if (min(l, c) >= 2*r1 + 2*r2) return 1;
if (min(l, c) >= 2*max(r1, r2) && max(l, c) >= 2*r1 + 2*r2) return 1;
if (c <= 2*r1 || c <= 2*r2 || l <= 2*r1 || l <= 2*r2) return 0;
if (sqrt(l*l + c*c) < 2*r1 + 2*r2) return 0;
if (c > l)
{
l = l ^ c;
c = l ^ c;
l = l ^ c;
}
double xcr1 = r1;
double xcr2 = c - r2;
double ycr1 = r1;
double ycr2 = l - r2;
if (sqrt((xcr1 - xcr2) * (xcr1 - xcr2) + (ycr1 - ycr2) * (ycr1 - ycr2)) < r1 + r2) return 0;
return 1;
}
int main()
{
int l, c, r1, r2;
int dim;
while(1)
{
cin >> l >> c >> r1 >> r2;
if (!l && !c && !r1 && !r2) return 0;
if (cabemdiagonal(l, c, r1, r2)) cout << "S\n";
else cout << "N\n";
}
}
#define PI 3.14159265
using namespace std;
int cabemdiagonal(int l, int c, int r1, int r2)
{
if (min(l, c) >= 2*r1 + 2*r2) return 1;
if (min(l, c) >= 2*max(r1, r2) && max(l, c) >= 2*r1 + 2*r2) return 1;
if (c <= 2*r1 || c <= 2*r2 || l <= 2*r1 || l <= 2*r2) return 0;
if (sqrt(l*l + c*c) < 2*r1 + 2*r2) return 0;
if (c > l)
{
l = l ^ c;
c = l ^ c;
l = l ^ c;
}
double xcr1 = r1;
double xcr2 = c - r2;
double ycr1 = r1;
double ycr2 = l - r2;
if (sqrt((xcr1 - xcr2) * (xcr1 - xcr2) + (ycr1 - ycr2) * (ycr1 - ycr2)) < r1 + r2) return 0;
return 1;
}
int main()
{
int l, c, r1, r2;
int dim;
while(1)
{
cin >> l >> c >> r1 >> r2;
if (!l && !c && !r1 && !r2) return 0;
if (cabemdiagonal(l, c, r1, r2)) cout << "S\n";
else cout << "N\n";
}
}
0 Comentários