1. 程式人生 > 其它 >Cf #779 (Div. 2) - C

Cf #779 (Div. 2) - C

題目連結

題目大意

這題目題意賊繞

給一個1~n的排列p,根據p做數列b,bi表示p1~pi中的最大值。b數列中不同的數值數量就是排列p的力量。

現在給出數列c,ci表示p向左迴圈右移i-1位所得到的力量值。問給出的c有沒有可能被一種p得到。

思路

觀察可知 1 有且只有一個,不符合的可直接判錯

通過幾組資料模擬可發現,每移動一位 ,下一個力量值最多增加 1 以此判斷是否正確

需要注意最後一位也要對第一為進行判斷

程式碼

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    while (T--)
    {
        int n;
        cin >> n;
        int s[n+1];
        int flag = 0;
        for (int i = 0; i < n; i++)
        {
            cin >> s[i];
            if (s[i] == 1)
                flag++;
        }
        s[n]=s[0];
        int k = 1;
        for (int i = 0; i + 1 <= n; i++)
            if (s[i + 1] - s[i] > 1)
            {
                k = 0;
                break;
            }
        if (k == 1 && flag == 1)
            cout << "YES\n";
        else
            cout << "NO\n";
    }
    return 0;
}