題目描述
麥兜最喜歡的食物是煎餅,每次在街上看到煎餅攤的時候都會在那里停留幾分鍾。最吸引麥兜還是煎餅師傅那一手熟練的翻煎餅的技術,一堆煎餅在那里,師傅只需要用鏟子翻幾下,就讓煎餅整齊的疊在了一起。 這天,為了慶祝麥兜被保送上研究生,他從煎餅師傅那里買回來一些煎餅請客。但是麥兜買回的煎餅大小不一,麥兜太想吃煎餅了,他想吃這些煎餅中最大的那個。麥兜還知道同學們也很喜歡煎餅,為了表示他的誠意,他想讓同學們先吃,麥兜最后吃,因此,麥兜想把煎餅按照從小到大的順序疊放在一起,大的在最下面。這樣麥兜就可以在最后拿到最大的那一塊煎餅了。 現在請你幫助麥兜用煎餅師傅翻煎餅的方法把麥兜買的煎餅從小到大的疊在一起。煎餅師傅的方法是用鏟子插入兩塊煎餅之間,然后將鏟子上的煎餅翻一轉,這樣鏟子上第一個煎餅就被翻到了頂上,而原來頂上的煎餅則被翻到了剛才插入鏟子的地方。麥兜希望這樣翻煎餅的次數最少。
輸入
輸入包括兩行,第一行是一個整數n(1<=n<=1000),表示煎餅的個數,接下來的一行有n個不相同的整數,整數間用空格隔開,每個整數表示煎餅的大小(直徑),左邊表示頂部,右邊表示底部。
輸出
輸出為一行,翻煎餅的最少次數
樣例輸入復制
5 5 4 2 3 1
樣例輸出
4
對於樣例的分析:
5 4 2 3 1 (最大的煎餅在頂部,反轉一次讓它在底部,整個數組都要倒序) 翻轉次數:0
1 3 2 4 5 (最大的煎餅已經在底部了,接着找第二大的煎餅,發現也在底部了,這里的底部是指n-1的位置,接着就是第三大的煎餅 3 了) 翻轉次數:1
3 1 2 4 5 (最大的煎餅在頂部,反轉一次讓它在底部,3到2整個數組都要倒序) 翻轉次數:2
2 1 3 4 5 (此時的最大的煎餅變成了2,將鏟子插到2和1之間,翻轉一次) 翻轉次數:3
1 2 3 4 5 翻轉次數:4
解析:題目中標記的地方為解題的重點部分,本題的關鍵是最大的煎餅的位置。
它的位置可以有三個:
1、在頂部
2、在底部
3、在中間
然而,當它在中間的時候,我們可以通過翻轉讓它在頂部位置,減少代碼量;
#include<iostream> using namespace std; int n; int sum=0; int a[1005]; int J() { if(n==0) return 0; int j=0;int max=0; for(int i=0;i<n;i++) if(a[i]>=max) { max=a[i]; j=i; } if(j==n-1)//最大煎餅在底部 { n--; J(); } else if(j==0){//最大煎餅在頂部,整個數組倒序 sum++; for(int i=n-1;i>j;i--) { int t=a[j]; a[j]=a[i]; a[i]=t; j++; } n--; J(); } else{//最大煎餅不在頂部,不在底部,反轉一次,數組部分倒序,使最大煎餅到頂部,執行上一步 sum++; for(int i=0;i<j;i++) { int t=a[i]; a[i]=a[j]; a[j]=t; j--; } J(); } } int main(){ cin>>n; for(int i=0;i<n;i++) cin>>a[i]; J(); cout<<sum<<endl; return 0; }
