题目描述
麦兜最喜欢的食物是煎饼,每次在街上看到煎饼摊的时候都会在那里停留几分钟。最吸引麦兜还是煎饼师傅那一手熟练的翻煎饼的技术,一堆煎饼在那里,师傅只需要用铲子翻几下,就让煎饼整齐的叠在了一起。 这天,为了庆祝麦兜被保送上研究生,他从煎饼师傅那里买回来一些煎饼请客。但是麦兜买回的煎饼大小不一,麦兜太想吃煎饼了,他想吃这些煎饼中最大的那个。麦兜还知道同学们也很喜欢煎饼,为了表示他的诚意,他想让同学们先吃,麦兜最后吃,因此,麦兜想把煎饼按照从小到大的顺序叠放在一起,大的在最下面。这样麦兜就可以在最后拿到最大的那一块煎饼了。 现在请你帮助麦兜用煎饼师傅翻煎饼的方法把麦兜买的煎饼从小到大的叠在一起。煎饼师傅的方法是用铲子插入两块煎饼之间,然后将铲子上的煎饼翻一转,这样铲子上第一个煎饼就被翻到了顶上,而原来顶上的煎饼则被翻到了刚才插入铲子的地方。麦兜希望这样翻煎饼的次数最少。
输入
输入包括两行,第一行是一个整数n(1<=n<=1000),表示煎饼的个数,接下来的一行有n个不相同的整数,整数间用空格隔开,每个整数表示煎饼的大小(直径),左边表示顶部,右边表示底部。
输出
输出为一行,翻煎饼的最少次数
样例输入复制
5 5 4 2 3 1样例输出复制
4#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> #include <time.h> #define endl '\n' #define N 200005 typedef long long ll; using namespace std; int p[N]; //将最大值依次归位 signed main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>p[i]; int c=0;//翻煎饼的次数 for(int i=1;i<=n;i++) { int max=1; for(int j=1;j<=n-i+1;j++) if(p[max]<p[j]) max=j;//找到最大值对应的下标 if(max!=n-i+1) { if(max!=1)//如果不能直接归位,先将此轮的最大值翻到第一位 { c++; for(int k=1;k<=max/2;k++) swap(p[k],p[max-k+1]); } //能直接归位了 c++; for(int k=1;k<=(n-i+1)/2;k++) swap(p[k],p[n-i-k+2]); } } cout<<c<<endl; return 0; }
04-11
1893
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交