思路
先找到最大的数,把它翻转到第一个,接着翻转整个数组把它置于最后一个,这样完成一次操作
最大的数已经置于末尾,那么之后的操作需要对它不造成影响,所以把数组index - 1,也就是丢下最后一个数不管了
然后我们处理数组[0]~[index - 1],即处理子问题
这里容易出现一个错误,如果最大的数为第一个数,那么就不需要进行第一次翻转,此处需要特判一下
代码实现
#include<stdio.h>
void change(int a[],int s,int e)
{
int i,t;
for(i=s;i<e-i;i++)
{
t=a[i];a[i]=a[e-i];a[e-i]=t;
}
}
int main()
{
int n,i,j,t,max,m,a[100000];
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
m=0;
for(i=n-1;i>=0;i--)
{
max=a[i];
t=i;
for(j=0;j<i;j++)
{
if(a[j]>max)
{
max=a[j];
t=j;
}
}
if(t==i) continue;
if(t!=0)
{
change(a,0,t);
m++;
}
change(a,0,i);
m++;
}
printf("%d\n",m);
}
return 0;
}