Programação Competitiva

Elevador [Maratona 2010]

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):

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.

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.

Exemplo de Entrada Exemplo de Saída
11 9 2 3
7 8 3 2
10 15 3 7
8 9 3 2
0 0 0 0
S
N
N
S

Dica

Podemos resolver diretamente alguns casos com uma verificação inicial simples: a menor dimensão da caixa, seja ela a largura ou a altura, deve ser suficientemente grande para que a circunferência de maior diâmetro possa ser colocada lá.

Devemos agora colocar as duas circunferências lado a lado, de modo que elas se tangenciam e tangenciam uma mesma aresta do retângulo dado. É nesta posição que elas ocupam o menor espaço possível, e a distância entre os centros é mínima. Seja R o segmento que liga os centros das circunferências (R=R1+R2). É fácil perceber que conseguimos construir um trapézio ligando os centros das circunferências à aresta que foi tangenciada. Desse trapézio, extraímos um triângulo retângulo cuja hipotenusa é justamente R.

Agora, podemos afastar as duas circunferências o máximo possível, colocando-as em extremidades diagonalmente opostas da caixa. Conseguimos construir um segundo trapézio ligando os centros a uma mesma aresta, e dele extrair um segundo triângulo retângulo de hipotenusa R. O comprimento de R é a distância máxima, dentro da caixa, entre os centros das circunferências.

Se R>R, os círculos cabem na caixa, e respondemos S. Se R<R, temos que na situação de afastamento máximo existe uma interseção entre os círculos , ou seja, os círculos não cabem na caixa. Assim, respondemos N.

Dica retirada de: http://wiki.maratona.dcc.ufmg.br/index.php/ELEVADOR

Solução em C

#include <stdio.h>
#include <math.h>

int main() {
	int l, c, r1, r2, maior;
	char saida;
	
	while ( scanf("%i %i %i %i",&l, &c, &r1, &r2) ) {
		if(l == 0 && c == 0 && r1 == 0 && r2 == 0) { return 0; }
		//o teste poderia ser: l+c+r1+r2 == 0
		//como os numeros sao sempre positivos, nao teria problema
		
		saida = 'N';
		if (r1 > r2) {
			maior = r1 + r1;
		} else {
			maior = r2 + r2;
		}
	
		if(maior <= l && maior <= c) {
			if(sqrt(pow((l - r2 - r1), 2) + pow((c - r2 - r1), 2)) >=  r1 + r2) {
				saida = 'S';
			}
		}
		
		printf("%c\n",saida);	
	}	
	return 0;
}

Teste o código: http://ideone.com/MW0fbR

 

 

Sair da versão mobile