標題254 翻煎餅
題目描述
麥兜最喜歡的食物是煎餅,每次在街上看到煎餅攤的時候都會在那裏停留幾分鐘。最吸引麥兜還是煎餅師傅那一手熟練的翻煎餅的技術,一堆煎餅在那裏,師傅只需要用鏟子翻幾下,就讓煎餅整齊的疊在了一起。 這天,爲了慶祝麥兜被保送上研究生,他從煎餅師傅那裏買回來一些煎餅請客。但是麥兜買回的煎餅大小不一,麥兜太想喫煎餅了,他想喫這些煎餅中最大的那個。麥兜還知道同學們也很喜歡煎餅,爲了表示他的誠意,他想讓同學們先喫,麥兜最後喫,因此,麥兜想把煎餅按照從小到大的順序疊放在一起,大的在最下面。這樣麥兜就可以在最後拿到最大的那一塊煎餅了。 現在請你幫助麥兜用煎餅師傅翻煎餅的方法把麥兜買的煎餅從小到大的疊在一起。煎餅師傅的方法是用鏟子插入兩塊煎餅之間,然後將鏟子上的煎餅翻一轉,這樣鏟子上第一個煎餅就被翻到了頂上,而原來頂上的煎餅則被翻到了剛纔插入鏟子的地方。麥兜希望這樣翻煎餅的次數最少。
輸入
輸入包括兩行,第一行是一個整數n(1<=n<=1000),表示煎餅的個數,接下來的一行有n個不相同的整數,整數間用空格隔開,每個整數表示煎餅的大小(直徑),左邊表示頂部,右邊表示底部。
輸出
輸出爲一行,翻煎餅的最少次數
樣例輸入
5
5 4 2 3 1
樣例輸出
4
代碼
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//查找該值的位置
int find(int *arr,int length, int num){
for(int i=0 ;i<length; i++){
if(arr[i] == num ) return i;
}
return -1;
}
//翻轉後的次序交換
void swap(int *arr, int start , int end){
int temp;
for(int i = start,j = end;i<j;i++,j--){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int main(){
int n;
cin>>n;
int *arr= new int[n];
vector<int>arr_sort;
for(int i=0; i<n; i++){
cin>>arr[i];
arr_sort.push_back(arr[i]);
}
sort(arr_sort.begin() ,arr_sort.end());//從大到小排序
int count = 0;
for(int i=n-1; i>=0; i--){
int index_max = find(arr, i+1, arr_sort[i]);
if(index_max != i){
if(index_max == 0){
swap(arr,0,i);
++count;
}
else{
swap(arr,0,index_max);
swap(arr,0,i);
count+=2;
}
}
}
cout<<count<<endl;
return 0;
}
思路
第一次找到最大的煎餅翻轉到最後一個,查找數組範圍縮小一個,重複,直到排序成功。
翻轉過程分爲三種情況:
1.查找的index_max在第一個位置,則翻轉一次即可;
2.查找的index_max在中間位置,則需要2次翻轉(有1次翻轉使index_max在第一個位置)
3.查找的index_max在縮小範圍的最後一個位置,則無需翻轉。