标题254: 翻煎饼
题目描述
麦兜最喜欢的食物是煎饼,每次在街上看到煎饼摊的时候都会在那里停留几分钟。最吸引麦兜还是煎饼师傅那一手熟练的翻煎饼的技术,一堆煎饼在那里,师傅只需要用铲子翻几下,就让煎饼整齐的叠在了一起。 这天,为了庆祝麦兜被保送上研究生,他从煎饼师傅那里买回来一些煎饼请客。但是麦兜买回的煎饼大小不一,麦兜太想吃煎饼了,他想吃这些煎饼中最大的那个。麦兜还知道同学们也很喜欢煎饼,为了表示他的诚意,他想让同学们先吃,麦兜最后吃,因此,麦兜想把煎饼按照从小到大的顺序叠放在一起,大的在最下面。这样麦兜就可以在最后拿到最大的那一块煎饼了。 现在请你帮助麦兜用煎饼师傅翻煎饼的方法把麦兜买的煎饼从小到大的叠在一起。煎饼师傅的方法是用铲子插入两块煎饼之间,然后将铲子上的煎饼翻一转,这样铲子上第一个煎饼就被翻到了顶上,而原来顶上的煎饼则被翻到了刚才插入铲子的地方。麦兜希望这样翻煎饼的次数最少。
输入
输入包括两行,第一行是一个整数n(1<=n<=1000),表示煎饼的个数,接下来的一行有n个不相同的整数,整数间用空格隔开,每个整数表示煎饼的大小(直径),左边表示顶部,右边表示底部。
输出
输出为一行,翻煎饼的最少次数
样例输入
5
5 4 2 3 1
样例输出
4
#include<bits/stdc++.h>
using namespace std;
#define N 1001
int n, ans, a[N];
void change(int x) //双指针二分翻转
{
int l, r;
ans++; //翻转次数加一
l = r = x / 2;
r++;
if(x%2 == 1) r++; //若X为奇数,则保持中值不动翻转其两边数
while(l > 0) swap(a[l--], a[r++]); //神奇的C++
}
int main()
{
int i, max_index;
cin >> n; //输入煎饼数n
for(i = 1; i <= n; i++) cin >> a[i]; //输入煎饼大小
ans = 0; //初始化ans
while(n > 1) //每次循环确定一个最大煎饼
{
max_index = 1; //最大煎饼下标
for(i = 2; i <= n; i++)
{
if(a[max_index] < a[i]) max_index = i;
}
if(max_index != n) //最大煎饼不在底部时
{
if(max_index > 1) change(max_index);//部分翻转最大煎饼翻到顶部
change(n); //总体翻转将最大煎饼翻到底部
}
n--; //每次翻转都将确定一个最大煎饼,下次翻转则不将其计入
}
cout << ans << endl;
return 0;
}
以上方法仅供参考,欢迎互联网的广大朋友们提出指正。