[伯俊]2161号2164号カード枚


質問する


カードがN枚あります.各カードには順番に1からNの番号が貼られており、1番札が一番上に、N番札が一番下に、順番にカードが置かれています.
カードが1枚残るまで、以下の動作を繰り返します.
  • 一番上の札を地面に投げます.
  • 以降、一番上のカードを一番下のカードの下に移動します.
  • 例えば、N=4とする.カードは一番上から1234の順番に並べられています.1を投げてまだ234残っています.ここで2を一番下に移動すると342です.3を42に、4を下に移動すると24になります.最後に2を捨てて、残りのカードは4になりました.

    2161番です。カード。


    https://www.acmicpc.net/problem/2161
    N(1≦N≦1000)が与えられた場合、廃棄されたカードを順番に出力し、最後に残ったカードを出力するプログラムを作成します.
    #include<iostream>
    #include<queue>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(NULL);
    
        int n;
        cin >> n; // 최대 1천개
    
        queue<int> q;
    
        for (int i = 1; i <= n; i++)
            q.push(i);
    
        while (q.size() != 1) {
            // 1. 맨 앞에 있는 카드 pop
            cout << q.front() << " ";
            q.pop();
    
            // 2. 그 다음 맨 앞에 있는 카드를 맨 뒤로 push
            int tmp = q.front();
            q.pop();
            q.push(tmp);
        }
    
        cout << q.front();
    
        return 0;
    }

    2164番です。カード。


    https://www.acmicpc.net/problem/2164
    N(1≦N≦500000)が与えられた場合、最後に残ったカードを取得するためのプログラムを作成します.
    #include<iostream>
    #include<queue>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(NULL);
    
        int n;
        cin >> n; // 최대 50만개
    
        queue<int> q;
    
        for (int i = 1; i <= n; i++)
            q.push(i);
    
        while (q.size() != 1) {
            // 1. 맨 앞에 있는 카드 pop
            //cout << q.front() << " ";
            q.pop();
    
            // 2. 그 다음 맨 앞에 있는 카드를 맨 뒤로 push
            int tmp = q.front();
            q.pop();
            q.push(tmp);
        }
    
        cout << q.front();
    
        return 0;
    }