けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 368 A - Cut (7Q, 灰色, 100 点)

for 文を工夫しよう

問題概要

長さ  N の数列  A_{1}, A_{2}, \dots, A_{N} が与えられる。

この数列の末尾の  K 個の要素を順序を保ったまま先頭に持ってきて得られる数列を出力せよ。

制約

  •  1 \le K \lt N \le 100

考えたこと

次のように考え直すとよい。なお、0-indexed で考えている。


数列の  N - K 番目からスタートして、数列  A を順番に一周して出力する。

なお、末尾の要素  A_{N-1} の次の要素は  A_{0} であると考えることにする。


このように数列を周回する処理は、下のコードのように、演算子「%」を用いて表現できる。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, K;
    cin >> N >> K;
    vector<int> A(N);
    for (int i = 0; i < N; i++) cin >> A[i];

    for (int i = 0; i < N; i++) {
        // i = 0 のとき(最初の要素)は A[N - K] である
        cout << A[(i + (N - K)) % N] << " ";
    }
    cout << endl;
}