翻煎饼 swust254
麦兜最喜欢的食物是煎饼,每次在街上看到煎饼摊的时候都会在那里停留几分钟。最吸引麦兜还是煎饼师傅那一手熟练的翻煎饼的技术,一堆煎饼在那里,师傅只需要用铲子翻几下,就让煎饼整齐的叠在了一起。 这天,为了庆祝麦兜被保送上研究生,他从煎饼师傅那里买回来一些煎饼请客。但是麦兜买回的煎饼大小不一,麦兜太想吃煎饼了,他想吃这些煎饼中最大的那个。麦兜还知道同学们也很喜欢煎饼,为了表示他的诚意,他想让同学们先吃,麦兜最后吃,因此,麦兜想把煎饼按照从小到大的顺序叠放在一起,大的在最下面。这样麦兜就可以在最后拿到最大的那一块煎饼了。 现在请你帮助麦兜用煎饼师傅翻煎饼的方法把麦兜买的煎饼从小到大的叠在一起。煎饼师傅的方法是用铲子插入两块煎饼之间,然后将铲子上的煎饼翻一转,这样铲子上第一个煎饼就被翻到了顶上,而原来顶上的煎饼则被翻到了刚才插入铲子的地方。麦兜希望这样翻煎饼的次数最少。
输入
输入包括两行,第一行是一个整数n(1<=n<=1000),表示煎饼的个数,接下来的一行有n个不相同的整数,整数间用空格隔开,每个整数表示煎饼的大小(直径),左边表示顶部,右边表示底部。
输出
输出为一行,翻煎饼的最少次数
样例输入
5 5 4 2 3 1
样例输出
4
题解:其实一开始根本没有理解题意额,其实翻煎饼他是这样翻的例如样例中的第一次翻 5 4 2 3 1 他是把铲子插入2这里 然后5 4 和3 1就各自交换位置,即煎饼本身的位置也是可以插的。 然后假如在第一次插的时候选择插4和2中间 那么5 4 和2 3是要交换位置的,而1 因为没有相应的空位,所以不移动。所以大概意思就是这样……我想了好久5555.
然后说一下思路,由翻煎饼的特性可以知道,很多大的数我们是可以一步翻到它自己应该去的位置的。所以我们优先考虑将当前混乱数组当中的最大数翻到相应的位置==,而再由翻煎饼的特性可知,想要把一个数翻到对应位置最多需要两步:1.把这个数翻到队头。2.把这个数翻到相应位置。所以思路就很明了了。为了便于查询当前混乱数组中的最大值,我们需要一个有序数组来记录一下。
代码如下
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int a[10000];
int b[1000];
int max = 0;
int maxid;
for (int i = 0; i < n; i++)
{
cin >> a[i];
b[i] = a[i];
if (a[i] > max)
{
max = a[i];
maxid = i;
}
}
//先排最大的数
sort(b, b + n);
int ans=0;
for (int i = 0; i < n; i++)
{
//找当前未排序数组中最大的数字
int nowid;
for (int j = 0; j < n; j++)
{
if (a[j] == b[n - i - 1])
{
nowid = j;
break;
}
}
//cout << nowid << "+" << a[i] <<n-i-1<< endl;
if (nowid == n - i - 1)
{
continue;
}
//将煎饼翻转到顶层
if (nowid != 0)
{
for (int j = nowid, k = 0; k < j; j--, k++)
{
int t = a[j];
a[j] = a[k];
a[k] = t;
}
ans++;
}
nowid = 0;
for (int j = nowid, k = n - i - 1; j < k; j++, k--)
{
int t = a[j];
a[j] = a[k];
a[k] = t;
}
ans++;
}
cout << ans<<endl;
}
return 0;
}