标题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在缩小范围的最后一个位置,则无需翻转。