PATレベルB1008配列要素の右シフト問題の回転(20ポイント)

トピックコンテンツ

配列AにはN(> 0)の整数があります。他の配列は許可されていないという前提で、各整数をM(≥0)だけ右に循環的に移動します。つまり、Aのデータは(A0)から変更されます。 A1⋯AN-1)は(AN-M⋯AN-1 A0 A1⋯AN-M-1)に変換されます(最後のM個の数字は最初のM個の位置に循環的に移動します)。プログラムがデータを移動する回数をできるだけ少なくする必要がある場合、移動方法を設計するにはどうすればよいですか?

入力フォーマット:

各入力にはテストケースが含まれ、最初の行はN(1≤N≤100)およびM(≥0)を入力し、2番目の行はスペースで区切られたN個の整数を入力します。

出力フォーマット:

スペースで区切られた、1行にMビットだけ右にシフトされた整数のシーケンスを出力します。シーケンスの最後に余分なスペースがあってはなりません。

入力サンプル:

6 2
1 2 3 4 5 6

最後に空白行はありません

サンプル出力:

5 6 1 2 3 4

最後に空白行はありません

問題解決のアイデア

この種の問題には固定された解決策があります。つまり、m <nを保証することを前提として、ベクトルを使用して配列にアクセスします(ここでは、m = m%nのメソッドを使用して保証できます)。 a [n-1]a [0] -a [m-1]a [m-1] -a [n-1]これらの3つの段落では、逆関数を順番に使用しています逆関数のパラメーターに注意してください)。それらの要素を逆にするために、左が閉じて右が開いています)。

詳細なコード

#include <iostream>
#include <algorithm>   
#include <vector>
using namespace std;
int main() {
    int n, m;
    cin >> n >> m;
    vector<int> a(n); 
    for (int i = 0; i < n; i++){
      cin >> a[i];
    }
    m %= n;   
        reverse(begin(a), begin(a) + n);
        reverse(begin(a), begin(a) + m);
        reverse(begin(a) + m, begin(a) + n);
    for (int i = 0; i < n - 1; i++)
        cout << a[i] << " ";
    cout << a[n - 1];  //解决pat考试中,输出的最后一个数字后不能有空格的问题
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45660485/article/details/119274088