F. Shift and Reverse

发布时间 2023-12-13 23:48:44作者: 黑屿白

通过操作获得非递减数列,采用KMP算法求解。

通过把一个数列打印两遍,遍历是否有长度为N的非递减数列或者非递增数列。

通过计算求出最小操作数量。

主要代码:

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int a[N];
int work(int n){
    int index=0,cnt=1,index2=0,cnt2=1;
    bool bol=false;
    int sum=N,sum2=N;
    for (int i=1;i<2*n;i++){
        if (a[i]>=a[i-1]) cnt++;   //找寻非递减数列 
        else {
            index=i;
            cnt=1;
        }
        if (a[i]<=a[i-1]) cnt2++;  //找寻非递增数列 
        else {
            index2=i;
            cnt2=1;
        }
        if (cnt==n || cnt2==n) bol=true;
        if (cnt==n)
            if (index)sum=min(n-index,index+2);
            else sum=0;
        if (cnt2==n)
            if (index2)sum2=min(n-index2+1,index2+1);
            else sum2=1;
    }
    if (!bol) return -1;
    return min(sum,sum2);
}
int main(){
    int t;
    cin>>t;
    while (t--){
        int n;
        cin>>n;
        for (int i=0;i<n;i++){
            cin>>a[i];
            a[i+n]=a[i];  //打印两遍 
        }
        if (n==1){printf("%d\n",0);continue;}
        int sum=work(n);
        if (sum==-1) printf("%d\n",-1);
        else printf("%d\n",sum);
    }
    return 0;
}