翻煎饼问题

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

 

输入

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

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

 

 

解:因为是用铲子翻煎饼,所以每翻一次,煎饼内部的顺序都会发生变化,这是需要注意的。如果这个煎饼的位置是在最上方,那么只需要翻一次煎饼就好了,把它翻到最上面去,如果煎饼的位置是在中间的话,那么我们要先把它翻到上面去,然后再翻一次,把它翻到最下面去,根据这个思路的话,我们应该有两个函数,第一个就是要找到最大的煎饼的位置,第二个就是要把煎饼翻转。

因此代码为

#include<iostream>
using namespace std;
int findMax(int a[], int n)
{
int max = 0,i;
for (i = 1; i < n; i++)
{
if (a[i]>a[max])
{
max = i;
}
}
return max;
}
void turnover(int a[], int k)
{
int *p = a, *q = a + k - 1;
while (p < q)
{
int t = *p;
*p = *q;
*q = t;
p++;
q--;
}
}

int main()
{
int n, i,sum=0,max=0;
cin >> n;
int *a = new int[n];//这里括号中一定要写入N不然要报CE错误,要不然就直接去掉括号和N

for (i = 0; i < n; i++)
{
cin >> a[i];
}
while (n>0)
{
max = findMax(a, n);
if (max != n - 1)
{
sum += (max == 0 ? 1 : 2);
turnover(a, max + 1);
turnover(a, n);
}
n--;
}
cout << sum << endl;
return 0;


}

posted on 2018-04-26 20:49  痒痒肉  阅读(1420)  评论(0编辑  收藏  举报

导航