题目描述

小Q在学习许多排序算法之后灵机一动决定自己发明一种排序算法,小Q希望能将n个不同的数排序为升序。小Q发明的排序算法在每轮允许两种操作:

1、 将当前序列中前n-1个数排为升序

2、 将当前序列中后n-1个数排为升序

小Q可以任意次使用上述两种操作,小Q现在想考考你最少需要几次上述操作可以让序列变为升序。

输入描述:


输入包括两行,第一行包括一个正整数n(3≤n≤10^5),表示数字的个数 第二行包括n个正整数a[i](1≤a[i]≤10^9),即需要排序的数字,保证数字各不相同。


输出描述:


输出一个正整数,表示最少需要的操作次数


示例1

输入

复制


6 4 3 1 6 2 5


输出

复制


2


#include<iostream>
#include<vector>
using namespace std;

int main(){
int n;int Result;
scanf("%d",&n);
vector<int> Input(n);
for(int i = 0;i < n;i ++){
int tmp;
cin >> tmp;
Input[i] = tmp;
}
int Max = Input[0];
int Min = Input[0];
bool isSorted = false;
for(int i = 1;i < n;i ++){
if(Max < Input[i]){
Max = Input[i];
}
if(Min > Input[i]){
Min = Input[i];
}
if(Input[i] < Input[i - 1]){
isSorted = true;
}
}
if(Min == Input[0] && Max == Input[n - 1]){
if(isSorted){Result = 0;}
else{Result = 1;}
}
else if(Min == Input[0] || Max == Input[n - 1]){
Result = 1;
}
else{
if(Min == Input[n - 1] && Max == Input[0]){
Result = 3;
}
else{
Result = 2;
}
}
cout << Result <<endl;
return 0;
}