通过操作获得非递减数列,采用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; }
标签:cnt,Reverse,int,Shift,sum,printf,递减,数列 From: https://www.cnblogs.com/purple123/p/17900216.html