分析:
本题目有两种做法:
- 投机取巧按照题目手动计算下标进行输出。
- 利用数学知识推导出输出区间,这样移动次数是最少的。
本次用第一种方法嘿嘿。
首先我们应该注意题目中并没有给定 M M M 的最大值,因此不能认为 M < N M < N M<N,而需要在读入 N N N 和 M M M 后令 M M M = M M M % N N N,这样就可以保证 M < N M < N M<N,使后面操作简单。这样做的依据是:对一个长度为 N N N 的序列,右移 N N N 位之后和当前序列是相同的。(这里读者可以手动模拟一下,如:1 2 3整体右移三位还是 1 2 3)
得到新的 M M M 后,可以直接输出序列从 N − M N - M N−M 号元素到 N − 1 N - 1 N−1 号元素,再输出 0 0 0 号元素到 N − M − 1 N - M - 1 N−M−1 号元素即可。
代码(C++)
#include <iostream>
using namespace std;
const int N = 110;
int q[N];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i ++) cin >> q[i];
m %= n;
int cnt = 0;
for (int i = n - m; i < n; i ++)
{
cout << q[i];
if (cnt < n - 1) cout << ' ';
cnt ++;
}
for (int i = 0; i < n - m; i ++)
{
cout << q[i];
if (cnt < n - 1) cout << ' ';
cnt ++;
}
}