411A - Проверка пароля
В первой задаче нужно было аккуратно реализовать написанное в условии. Например, так:
string s; cin >> s; bool upper = false, lower = false, digit = false; for(int i= 0; i < s.size(); ++i){ if(isupper(s[i])) upper = true; if(islower(s[i])) lower = true; if(isdigit(s[i])) digit = true; } puts((upper && lower && digit && s.size() >= 5) ? "Correct" : "Too weak");
411B - Многоядерный процессор
В этой задаче важно было внимательно прочитать условие и разобрать несколько принципиальных случаев. Далее нужно было аккуратно реализовать в коде разбор случаев. Авторское решение делало это следующим образом:
- Будем хранить массивы blockedCell[] (значение в ячейке i равно 1, если соответствующая клетка заблокирована, и 0 иначе), blockedCore[] (значение в ячейке i равно 0, если соответствующее ядро еще не заблокировано, и номеру такта, когда ядро заблокируется, иначе).
- Будем итерироваться по тактам начиная с первого. Рассмотрим некоторый такт k.
- Проходом по процессорам пересчитаем, какие ячейки заблокируются на такте k. Выставим в соответствующих ячейках массива blockedCell[] единицы.
- Далее, для каждого ядра i, если выполняется условие ([blockedCore[i] равно 0] И [blockedCell[x[i][k]] равно 1]), тогда ядро i заблокируется на такте k. Запишем blockedCore[i] = k.
411C - Кикер
Для того, чтобы решить эту задачу нужно было воспользоваться логикой (математической логикой) :]. Логика подсказывает, что:
- Если для какого-то расположения первой команды, не существует расположения второй команды, при котором она может гарантировать себе хотя бы ничью, тогда гарантированно выигрывает первая команда.
- Если для любого расположения первой команды, существует расположение второй команды, при котором она может гарантировать себе победу, тогда гарантированно побеждает вторая команда.
- Иначе, никто не может победить гарантированно, нужно вывести Draw.
Сделав описанные рассуждения, нужно реализовать их в коде. Делается это перебором всех возможных вариантов расположения игроков.
Tutorual?