1.题目描述:麦兜最喜欢的食物是煎饼,每次在街上看到煎饼摊的时候都会在那里停留几分钟。最吸引麦兜还是煎饼师傅那一手熟练的翻煎饼的技术,一堆煎饼在那里,师傅只需要用铲子翻几下,就让煎饼整齐的叠在了一起。 这天,为了庆祝麦兜被保送上研究生,他从煎饼师傅那里买回来一些煎饼请客。但是麦兜买回的煎饼大小不一,麦兜太想吃煎饼了,他想吃这些煎饼中最大的那个。麦兜还知道同学们也很喜欢煎饼,为了表示他的诚意,他想让同学们先吃,麦兜最后吃,因此,麦兜想把煎饼按照从小到大的顺序叠放在一起,大的在最下面。这样麦兜就可以在最后拿到最大的那一块煎饼了。 现在请你帮助麦兜用煎饼师傅翻煎饼的方法把麦兜买的煎饼从小到大的叠在一起。煎饼师傅的方法是用铲子插入两块煎饼之间,然后将铲子上的煎饼翻一转,这样铲子上第一个煎饼就被翻到了顶上,而原来顶上的煎饼则被翻到了刚才插入铲子的地方。麦兜希望这样翻煎饼的次数最少。
输入:输入包括两行,第一行是一个整数n(1<=n<=1000),表示煎饼的个数,接下来的一行有n个不相同的整数,整数间用空格隔开,每个整数表示煎饼的大小(直径),左边表示顶部,右边表示底部。
输出:输出为一行,翻煎饼的最少次数
测试数据:
5 5 4 2 3 1 输出:4
解题思路:设煎饼数组名字为a。输入的煎饼个数为n,煎饼存储的数组序号为0---n-1。有一个自己添加的turna的函数。迭代n次每次n--去查询n个数组里面煎饼最大的位置序号,如果位置为1的话直接turn(n-1)。如果位置不为1的话先把最大的翻到顶部,然后翻到“底部”。
代码实现:
#include<bits/stdc++.h>
using namespace std;
int n;
int pancake[1010];
void turnpancake(int j)
{
int a=pancake[0];
int t=0;
for(int i=j;i>t;i--)
{
pancake[t]=pancake[i];
pancake[i]=a;
a=pancake[++t];
}
}//j表示铲子上面的煎饼
int _n,t,flag;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>pancake[i];
}
_n=n-1;
while(_n)
{
flag=0;
for(int i=1;i<n;i++)
{
if(pancake[i]>pancake[flag])
{
flag=i;//记录最大煎饼的位置 并且每次n--后最大的煎饼值也会变
}
}
if(flag==0)
{
turnpancake(n-1);
t++;
}//最大煎饼在顶层
else if(flag!=n-1)
{
turnpancake(flag);
turnpancake(n-1);//每次把数组中相对最大的翻到数组的底部
t+=2;
}
n--;
_n--;
}
cout<<t<<endl;
return 0;
}