pesquisa

URI PROBLEMA 1124 - Elevador SOLUÇÃO EM C++

URI Online Judge | 1124

Elevador

Maratona de Programação da SBC  Brasil
Timelimit: 1
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.




#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";
    }
}

Postar um comentário

0 Comentários