LINUX.ORG.RU

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

 ,


1

3

Привет, лор!

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

На стандартный поток ввода подаётся три целых положительных числа — стороны треугольника. Числа не превосходят 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;
}

Ответ на: комментарий от MKuznetsov

сортировать изначально нах. ненадо - надо просто узнать кто там максимальный

Рукалицо. Чтобы узнать какой элемент максимальный, нужно, внезапно, сравнить элементы друг с другом. То есть отсортировать, частично.

в рамках задачи любые 2 2 (пары одинаковых значений) это спец-ветка - это точно не пифагорова тройка.

Рукалицо. Речь вообще шла (якобы) особенности std::min и std::max в ситуациях, когда входные параметры равны. (Особенностей нет.)

Задача вообще про криптографию

Рукалицо. Эта задача — про условия, if/then/else. Она из учебника по С++ от Яндекса. Буквально первая глава, четвёртый параграф. Учебник для совсем начинающих.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Рукалицо. Эта задача — про условия, if/then/else. Она из учебника по С++ от Яндекса. Буквально первая глава, четвёртый параграф. Учебник для совсем начинающих.

это задача из основ математики. Кстати весьма красивая : https://imghost.net/ib/bUyFroWnMW (выдалось время - нарисовал). «элементарные гипотенузы на скатерти улама», можно использовать вместо нескучных обоев

MKuznetsov ★★★★★
()