Top.Mail.Ru
Ответы

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

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

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

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

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

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

Во второй строке выведите номер шага, на котором это произойдёт.

По дате
По рейтингу
Аватар пользователя
Новичок
12345678910111213141516171819
 #include <deque> 
#include <iostream> 
#include <numeric> 
using namespace std; 
int main() { 
    size_t n, k, m = 0; 
    cin >> n >> k; 
    deque<size_t> 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'; 
} 
Аватар пользователя
Профи

Решение на 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".


Это оно?