Задача
Даны размеры прямоугольных открытки и конверта. Требуется определить, поместится ли открытка в конверт.
Входные данные
В первой строке находятся размеры открытки, во второй — размеры конверта. Размеры открытки и конверта — целые положительные числа, не превосходящие $100.$
Выходные данные
Если открытку можно вложить в конверт, вывести $Possible,$ если нет — вывести $Impossible$.
Тесты
№ | Входные данные | Выходные данные |
1 | 1 10 9 9 |
Possible |
2 | 20 40 2 4 |
Possible |
3 | 50 20 40 40 |
Impossible |
4 | 10 4 5 5 |
Impossible |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <cmath> #include <iostream> using namespace std; int main() { int H, W, h, w, t, d2; cin >> h >> w >> H >> W; if (W < H) { t = W; W = H; H = t; } if (h >= w) { t = h; h = w; } else t = w; d2 = t * t + h * h; if (h <= H and t <= W or H * sqrt(d2 - W * W) + W * sqrt(d2 - H * H) <= t * t - h * h) cout << "Possible"; else cout << "Impossible"; return 0; } |
Второй способ решения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <cmath> #include <iostream> using namespace std; int main() { int H, W, h, w; cin >> h >> w >> H >> W; int t = max(H, W); H = min(H, W); W = t; t = max(h, w); h = min(h, w); w = t; int d2 = w * w + h * h; if (h <= H and w <= W or H * sqrt(d2 - W * W) + W * sqrt(d2 - H * H) <= w * w - h * h) cout << "Possible"; else cout << "Impossible"; return 0; } |
Код без условных операторов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <cmath> #include #include using namespace std; int main() { int H, W, h, w; cin >> h >> w >> H >> W; int t = max(H, W); H = min(H, W); W = t; t = max(h, w); h = min(h, w); w = t; int d2 = w * w + h * h; (h <= H and w <= W or H * sqrt(d2 - W * W) + W * sqrt(d2 - H * H) <= w * w - h * h) and cout << "Possible"; !(h <= H and w <= W or H * sqrt(d2 - W * W) + W * sqrt(d2 - H * H) <= w * w - h * h) and cout << "Impossible"; return 0; } |
Решение
Объявляем и вводим переменные $H$, $W$, $h$, $w$, где будем хранить длины открыток и конверта. Потом находим наибольшую сторону конверта и открытки, найдем диагональ конверта. Пользуясь тем, что мы знаем точно какие варианты «Possible» ставим выводим их, а в противном случае «Impossible».Утверждение: если выполняются четыре тривиальных неравенства: — то открытку в конверт можно вставить тогда и только тогда, когда можно расположить один из противоположных концов открытки на нижнем основании конверта, а второй — на верхнем и при этом открытка помещается в конверт. Из утверждения следует, что открытку нужно «поднять» на максимальный угол и посмотреть, входит ли открытка в таком положении в конверт, то есть меньше ли горизонтальное измерение «поднятой» открытки, чем ширина конверта.
Ссылки
ideone
e-olymp
e-olymp
ideone
ideone (без условных операторов)
e-olymp