Задача
Гена собирается на туристический слет учеников своей школы. В своем классе он был назначен ответственным за палатки. У себя дома он нашел 3 палатки: первая их них весит [latex]a_1[/latex] килограмм и вмещает [latex]b_1[/latex] человек, вторая весит [latex]a_2[/latex] килограмм и вмещает [latex]b_2[/latex] человек, третья весит [latex]a_3[/latex] килограмм и вмещает [latex]b_3[/latex] человек.
В классе Гены [latex]k[/latex] человек. Выясните, может ли он выбрать палатки так, чтобы в них все могли поместиться. При этом учитывайте, что выбранные палатки должны суммарно весить не более [latex]w[/latex] килограмм.
Входные данные
Первая строка содержит два целых числа [latex]k[/latex] и [latex]w[/latex] ([latex]1 \le k \le 15[/latex], [latex]1 \le w \le 30[/latex]). Вторая строка содержит шесть целых чисел: [latex]a_1, a_2, a_3, b_1, b_2, b_3[/latex] ([latex]1 \le a_1, a_2, a_3 \le 15[/latex], [latex]1 \le b_1, b_2, b_3 \le 30[/latex]).
Выходные данные
Выведите YES, если палатки указанным образом выбрать можно, и NO в противном случае.
Тесты
Входные данные |
Выходные данные |
10 10
5 5 6 6 4 5 |
YES |
2 2
2 1 2 1 1 1 |
NO |
15 30
10 3 10 5 11 7 |
NO |
8 8
5 4 4 5 3 6 |
YES |
5 30
6 1 12 2 10 1 |
NO |
Код программы (вариант с тернарной операцией)
|
#include <iostream> using namespace std; int main() { unsigned short int k , w , a1 , b1 , a2 , b2 , a3 , b3; cin >> k >> w >> a1 >> b1 >> a2 >> b2 >> a3 >> b3; bool flag = ( ( ( k <= b1 ) && ( w >= a1 ) ) || ( ( k <= b2 ) && ( w >= a2 ) ) || ( ( k <= b3 ) && ( w >= a3 ) ) || ( ( k <= b1 + b2 ) && ( w >= a1 + a2 ) ) || ( ( k <= b2 + b3 ) && ( w >= a2 + a3 ) ) || ( ( k <= b1 + b3 ) && ( w >= a1 + a3 ) ) || ( ( k <= b1 + b2 + b3 ) && ( w >= a1 + a2 + a3 ) ) ); cout << ( flag ? "YES" : "NO" ); return 0; } |
Код программы (линейный вариант)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
#include <iostream> using namespace std; int main() { unsigned short int k , w , a1 , b1 , a2 , b2 , a3 , b3; cin >> k >> w >> a1 >> b1 >> a2 >> b2 >> a3 >> b3; bool flag = ( ( ( k <= b1 ) && ( w >= a1 ) ) || ( ( k <= b2 ) && ( w >= a2 ) ) || ( ( k <= b3 ) && ( w >= a3 ) ) || ( ( k <= b1 + b2 ) && ( w >= a1 + a2 ) ) || ( ( k <= b2 + b3 ) && ( w >= a2 + a3 ) ) || ( ( k <= b1 + b3 ) && ( w >= a1 + a3 ) ) || ( ( k <= b1 + b2 + b3 ) && ( w >= a1 + a2 + a3 ) ) ); cout << ( char )( flag * 'Y' - ( flag - 1 ) * 'N' ) << ( char )( flag * 'E' - ( flag - 1 ) * 'O' ) << ( char )( flag * 'S' - ( flag - 1 ) * ' ' ); return 0; } |
Решение задачи
Путем полного перебора получим несколько вариантов выбора палаток: взять одну из трёх палаток, две из трёх, или все три. Зададим переменную
flag типа
bool, принимающую значение, равное значению логического выражения, которое истинно лишь в случае удовлетворения хотя бы одного из вариантов условиям вместимости и веса, и ложно, если ни один из вариантов не удовлетворяет этим условиям. Затем с помощью тернарной операции выведем YES, если значение
flag равно
true, или NO, в случае противном.
Во втором варианте кода в выводе вместо тернарной операции используются операции математические, ведь условие «если А, то B, а иначе — C» на языке математики можно представить как BA — C(A-1), A = {0,1}, и так как переменная типа
boolсодержит в себе значение либо 0, либо 1, а литералы типа
char содержат не сами символы, а их числовой код из таблицы ASCII, то это вполне реализуемо. В данном коде происходит последовательное выведение трёх символов типа
char: «Y», «E» и «S» в случае
flag = 1, и «N», «O» и пробел, если
flag = 0 .
Ссылки
E-Olymp
Ideone (вариант с тернарной операцией)
Ideone (линейный вариант)
Related Images: