Official

A - Cut Editorial by kyopro_friends


初心者の方へ

操作後の山の一番上にあるのは、もともと下から \(K\) 番目にあったカードです。下から \(K\) 番目は上から \(N-K+1\) 番目なので、操作後の山のカードには、上から順に \(A_{N-K+1},A_{N-K+2},\ldots,A_{N},A_{1},A_{2},\ldots,A_{N-K}\) が書かれています。これを出力すればよいです。

多くのプログラミング言語では、配列の添字は \(0\) から始まるため、添字に注意してください。

実装例(C++)

#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=n-k; i<n; i++) cout << a[i] << ' ';
  for(int i=0; i<n-k; i++) cout << a[i] << ' ';
}

実装例(Python)

N,K = map(int,input().split())
A = list(map(int,input().split()))
for i in range(N-K,N): print(A[i])
for i in range(N-K): print(A[i])

なおPython などの言語では、問題文の通りに「山を上下にわけ、下側を上に移す」という操作を以下の通り簡単に行うことができます。

実装例(Python)

N,K = map(int,input().split())
A = list(map(int,input().split()))
top = A[:-K]  # 上側
bottom = A[-K:]  # 下側
B = bottom + top  # 下側を上に持ってくる
print(*B)

また、C++には問題文の操作そのものを行うrotateという関数があり、これを用いて解くこともできます。

実装例(C++)

#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];
  rotate(a.begin(), a.begin()+n-k, a.end());
  for(int i=0; i<n; i++) cout << a[i] << ' ';
}

posted:
last update: