1. 程式人生 > 其它 >Codeforces Round #776 (Div. 3) D Twist the Permutation (模擬)

Codeforces Round #776 (Div. 3) D Twist the Permutation (模擬)

題意(太難懂了

給定一個1-n數字的排列,要求通過一系列操作恢復到1-n順序。第i個操作就是將前i個元素旋轉左移任意次,讓第i個元素到i的位置,記錄每個數到它的位置需要左旋多少次,再將前i個元素左旋這些次數,然後再操作下一次。
時間複雜度為0(n^2)
每個數到它的位置需要左旋的次數為ans[i] = b[i] % i, b[i]是i的位置
前i個元素左旋ans[i]次b[j] = (b[j] - ans[i] + i) % i

程式碼

#include <iostream>

using namespace std;

const int N = 2010;
int a[N], b[N], ans[N];

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        int n;
        cin >> n;
        for(int i = 1; i <= n; i ++ )
        {
            cin >> a[i];
            b[a[i]] = i;    // 記錄a[i]的位置
        }
        for(int i = n; i >= 1; i --)
        {
            ans[i] = b[i] % i;
            for(int j = 1; j <= i; j ++ )
            {
                b[j] = (b[j] - ans[i] + i) % i;
            }
        }
        for(int i = 1; i <= n; i ++ )
            printf("%d ", ans[i]);
        puts("");
    }
    return 0;
}