题目大意:给你n个数,你每次可以选任意一个连续的子段(不能是整个数列)将其中的数字按任意顺序排序,求将这n个数排序成为单调递增序列的最小次数。
思路:用贪心就行,每次更改最长的连续子段;
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
int a[100];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int flag=0;
int max1=0;
int min1=0x3f3f3f3f;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]<a[i-1]){
flag=1; //判断该序列本身是否单调递增
}
max1=max(max1,a[i]);//求出序列最大值
min1=min(min1,a[i]);//求出序列最小值
}
int ans=0;
if(flag==0){
cout<<ans<<"\n";
}
else{
if(a[1]==max1&&a[n]==min1){//第一个数是序列最大值,最后一个数是序列最小值,此时需要修改3次:原序列:54231 51234 12354 12345 共需要三次修改
ans=3;
}
else if(a[1]==min1){
ans=1;//如果第一个是序列最小值,只需要修改之后的序列就可以,所以只需要一次
}
else if(a[n]==max1){//如果最后一个是序列最大值,只需要修改前面的序列,也是只需要一次
ans=1;
}
else { //其他情况 例如 41532 13452 12345 需要修改两次
ans=2;
}
cout<<ans<<"\n";
}
}
}