Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача по информатике C++

Владимир Петрович Ученик (83), закрыт 8 месяцев назад
На столе у большого начальника лежит стопка из N заявлений, пронумерованных сверху вниз от 1 до N.
Первое заявление он подписывает и убирает из стопки, второе – выбрасывает в мусорную корзину, третье – кладёт вниз стопки. Далее процесс продолжается аналогично, пока заявления в стопке не закончатся.
Определите, будет ли заявление с номером K подписано или выброшено, а также номер шага, на котором это произойдёт. Одним шагом является каждая из трёх операций, описанных выше.

Формат входных данных

Первая строка входных данных содержит целое число N, вторая строка – целое число K (1 ≤ N ≤ 109, 1 ≤ K ≤ N).

Формат выходных данных

В первой строке выведите «Yes», если заявление с номером K будет подписано, и «No», если оно будет выброшено.

Во второй строке выведите номер шага, на котором это произойдёт.
Лучший ответ
Николай Веселуха Высший разум (359979) 10 месяцев назад
 #include  
#include
#include
using namespace std;
int main() {
size_t n, k, m = 0;
cin >> n >> k;
deque box(n);
iota(box.begin(), box.end(), 1);
while (!box.empty()) {
const auto front = box.front();
if (0 == ++m % 3) box.push_back(front);
else if (2 == m % 3);
else if (front == k) break;
box.pop_front();
}
puts(box.empty() ? "No" : "Yes");
cout << m << '\n';
}
Остальные ответы
Idom syuda. Знаток (308) 11 месяцев назад
Решение на C++:

#include <iostream> using namespace std; int main() { int n, k, step = 0; cin >> n >> k; while (n > 0) { step++; if (k == 1) { cout << "Yes\n" << step << endl; return 0; } if (k == 2) { k--; } else if (k > 2) { k -= 2; } n--; } cout << "No\n"; return 0; }

Сначала считываем значения n и k. Затем запускаем цикл, который повторяется, пока есть заявления в стопке. На каждой итерации увеличиваем счётчик шагов на 1. Если текущее заявление имеет номер 1, выводим "Yes" и номер шага, на котором это произошло, и завершаем программу. Если текущее заявление имеет номер 2, просто уменьшаем номер нужного заявления на 1. В оставшихся случаях уменьшаем номер нужного заявления на 2. После этого уменьшаем количество заявлений в стопке на 1. Если заявление с номером k не было найдено до того, как закончились заявления в стопке, выводим "No".


Это оно?
Wesley AlbertЗнаток (319) 11 месяцев назад
неверно выводит
ВВОД
4
3
ОЖИДАЕМЫЙ ВЫВОД
NO
5
Idom syuda. Знаток (308) Wesley Albert, Если мы провалились в цикл по исчерпанию заявлений в стопке, то нужно вывести номер последнего шага, на котором мы проверили последнее заявление: #include <iostream> using namespace std; int main() { int n, k, step = 0; cin >> n >> k; while (n > 0) { step++; if (k == 1) { cout << "Yes\n" << step << endl; return 0; } if (k == 2) { k--; } else if (k > 2) { k -= 2; } n--; } cout << "No\n" << step << endl; // выводим номер последнего шага return 0; }
Похожие вопросы