其他分享
首页 > 其他分享> > 254: 翻煎饼

254: 翻煎饼

作者:互联网

254: 翻煎饼

题目描述

麦兜最喜欢的食物是煎饼,每次在街上看到煎饼摊的时候都会在那里停留几分钟。最吸引麦兜还是煎饼师傅那一手熟练的翻煎饼的技术,一堆煎饼在那里,师傅只需要用铲子翻几下,就让煎饼整齐的叠在了一起。
这天,为了庆祝麦兜被保送上研究生,他从煎饼师傅那里买回来一些煎饼请客。但是麦兜买回的煎饼大小不一,麦兜太想吃煎饼了,他想吃这些煎饼中最大的那个。麦兜还知道同学们也很喜欢煎饼,为了表示他的诚意,他想让同学们先吃,麦兜最后吃,因此,麦兜想把煎饼按照从小到大的顺序叠放在一起,大的在最下面。这样麦兜就可以在最后拿到最大的那一块煎饼了。
现在请你帮助麦兜用煎饼师傅翻煎饼的方法把麦兜买的煎饼从小到大的叠在一起。煎饼师傅的方法是用铲子插入两块煎饼之间,然后将铲子上的煎饼翻一转,这样铲子上第一个煎饼就被翻到了顶上,而原来顶上的煎饼则被翻到了刚才插入铲子的地方。麦兜希望这样翻煎饼的次数最少。

输入

输入包括两行,第一行是一个整数n(1<=n<=1000),表示煎饼的个数,接下来的一行有n个不相同的整数,整数间用空格隔开,每个整数表示煎饼的大小(直径),左边表示顶部,右边表示底部。

输出

输出为一行,翻煎饼的最少次数

样例输入

5
5 4 2 3 1

样例输出

4

思路

主要是要理解题意,本质是一个排序问题,每次翻转,铲子上的所有饼子全部逆序掉下来,达到原来顶上的煎饼掉到铲子的地方,而原来铲上第一个饼子到达顶部的效果。

  1. 先找到最大饼子的位置
  2. 判断余下最大煎饼是否在已排好最大煎饼的上一个位置
  3. 如果不是,则先把它翻到顶部,然后再翻到下面
  4. 如果是则无需再翻

代码

#include<iostream>
#include<algorithm>

using namespace std;
int main(){
int n;
int a[1005];
int count=0;
cin>>n;
for(int i=1;i<=n;i++){
    cin>>a[i];
}
for(int i=1;i<=n;i++){
    int max=1;
    for(int j=1;j<=n-i+1;j++){//先找到最大的煎饼的位置
        if(a[j]>a[max]){
            max=j;
        }
    }
    if(max!=n-i+1){//如果最大的煎饼不在最下
        if(max!=1){//如果最大的煎饼不在顶部,则将其翻到顶部
            for(int k=1;k<=max/2;k++){
                swap(a[k],a[max-k+1]);
            }
            count++;//翻到顶部计数一次
        }
        for(int k=1;k<=(n-i+1)/2;k++){//把在顶部的煎饼翻到下面
            swap(a[k],a[n-i-k+2]);
        }
        count++;//翻到下面计数一次
    }

}
cout<<count<<endl;
}

标签:翻到,铲子,int,max,麦兜,煎饼,254
来源: https://blog.csdn.net/qq_50090137/article/details/117266676