贪心——牛牛的排序
题目描述
牛牛刚学完排序,他准备拿n个数一展身手,但是他发现现实中的排序与课堂里的排序不一样。
每次他只能对连续的n-1个数进行从小到大的排序。
请问牛牛最少需要几次排序能将所有的数排成有序的。
输入描述
第一行先输入一个整数n (3 ≤ ≤ 50)。
第二行输入n个整数范围在1到1000以内。
输出描述
输出一个整数。
示例1
输入
4
2 6 8 5
输出
1
示例2
输入
6
4 3 1 6 2 5
输出
2
示例3
输入
5
50 20 30 40 10
输出
3
备注:
子任务1:n <= 10
子任务2:n <= 20
子任务3:无限制
分析
这个题要分四种情况考虑
1.输入的数本来就已经排好序了,那么就不需要排序了,输出0。
2.当输入的第一个数是最小或者最后一个数是最大时,那么最少需要1次排序。
3.当输入的第一个数是最大和最后一个数是最小时,最少需要3次排序。
4.其他情况则至少需要2次排序。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
int a[101],b[101];
int main()
{
cin>>n;
int min=1000,max=-1000;
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=a[i];
if(min>a[i]){
min=a[i];
}
if(max<a[i]){
max=a[i];
}
}
sort(b,b+n);
int flag=0;
for(int i=0;i<n;i++){
if(a[i]!=b[i]){
flag=1;
break;
}
}
if(flag==0){
cout<<0<<endl;
}
else{
if(a[0]==min||a[n-1]==max){
cout<<1<<endl;
}
else if(a[0]==max&&a[n-1]==min){
cout<<3<<endl;
}
else{
cout<<2<<endl;
}
}
return 0;
}