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