LINUX.ORG.RU

Сообщения magictree

 

Задача про прямоугольный треугольник от Яндекса

Форум — Development

Привет, лор!

Я решил попрактиковаться в программировании и наткнулся на задачу от Яндекса про прямоугольные треугольники. Я ее почти решил, только один из тестов не проходит, никак не пойму что не так.

На стандартный поток ввода подаётся три целых положительных числа — стороны треугольника. Числа не превосходят 30000.

Формат вывода Если полученный треугольник является прямоугольным, напечатайте YES. Если треугольник не является прямоугольным, напечатайте NO. Если с заданными сторонами невозможно построить треугольник, напечатайте UNDEFINED.

Вот как я рассудил: надо найти максимальную и меньшие стороны треугольника. Если максимальная больше или равна сумме меньших, то такой треугольник нельзя построить. А если все ок, то сравниваем квадраты меньших сторон и гипотенузы. Все хорошо ровно до теста №24. В какой-то момент я отчаялся и заменил мое сравнение на тупой перебор сумм сторон и все заработало. Теперь никак не могу понять где я был не прав в своей первой гипотезе.

Вот весь код:

#include <iostream>
#include <algorithm>

static int undefined() {
    std::cout << "UNDEFINED" << std::endl;
    return 0;
}

int main()
{
    int32_t l[3];
    for(int i = 0; i < 3; i++) {
        std::cin >> l[i];
        
        if(l[i] < 1) {
            return undefined();
        }
    }
    
    int32_t a, b, h;
    h = std::max(l[0], l[1]); // большее из первых двух чисел побудет пока гипотенузой
    a = std::min(l[0], l[1]); // а меньшее - точно не гипотенуза
    b = std::min(h, l[2]);    // то же самое
    h = std::max(h, l[2]);    // h теперь - наибольшая сторона

    if(h >= a + b) {
        return undefined();
    }

    // если заменить условие выше на вот это, то все проходит:
//    return l[0] + l[1] > l[2] and
//           l[1] + l[2] > l[0] and
//           l[0] + l[2] > l[1];

    
    if(a * a + b * b == h * h ) {
        std::cout << "YES";
    }
    else {
        std::cout << "NO";
    }
    
    std::cout << std::endl;

    return 0;
}

 ,

magictree
()

RSS подписка на новые темы