翻煎饼

思路

先找到最大的数,把它翻转到第一个,接着翻转整个数组把它置于最后一个,这样完成一次操作
最大的数已经置于末尾,那么之后的操作需要对它不造成影响,所以把数组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;
}

results matching ""

    No results matching ""