SWUST oj 254: 翻煎饼

题目描述

麦兜最喜欢的食物是煎饼,每次在街上看到煎饼摊的时候都会在那里停留几分钟。最吸引麦兜还是煎饼师傅那一手熟练的翻煎饼的技术,一堆煎饼在那里,师傅只需要用铲子翻几下,就让煎饼整齐的叠在了一起。 这天,为了庆祝麦兜被保送上研究生,他从煎饼师傅那里买回来一些煎饼请客。但是麦兜买回的煎饼大小不一,麦兜太想吃煎饼了,他想吃这些煎饼中最大的那个。麦兜还知道同学们也很喜欢煎饼,为了表示他的诚意,他想让同学们先吃,麦兜最后吃,因此,麦兜想把煎饼按照从小到大的顺序叠放在一起,大的在最下面。这样麦兜就可以在最后拿到最大的那一块煎饼了。 现在请你帮助麦兜用煎饼师傅翻煎饼的方法把麦兜买的煎饼从小到大的叠在一起。煎饼师傅的方法是用铲子插入两块煎饼之间,然后将铲子上的煎饼翻一转,这样铲子上第一个煎饼就被翻到了顶上,而原来顶上的煎饼则被翻到了刚才插入铲子的地方。麦兜希望这样翻煎饼的次数最少。

输入

输入包括两行,第一行是一个整数n(1<=n<=1000),表示煎饼的个数,接下来的一行有n个不相同的整数,整数间用空格隔开,每个整数表示煎饼的大小(直径),左边表示顶部,右边表示底部。

输出

输出为一行,翻煎饼的最少次数

样例输入

5
5 4 2 3 1

样例输出

4

思路

找到最到的煎饼,如果煎饼不在最上面,将其翻转在最上面,再将其翻转到最下面
然后依次找到次大的煎饼,执行上述操作。
1 3 2 4 5
3 1 2 4 5
2 1 3 4 5
1 2 3 4 5

代码如下

#include<stdio.h>
#include<stdlib.h>
int a[1002]={0};
bool flag=true;//是否满足非从小到大排序 
int dex=0;//已经排好位置的数量 
int conut=0;//最大值下标 
int ans=0; //翻转次数 
void print(int n){
	for(int i=1;i<=n;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
}
void juge(int n){
	int flag1=0 ;
	for(int i=1;i<=n-1;i++){
		if(a[i]>a[i+1]){
			flag=true;
			flag1++;
		}
	}
	if(flag1==0){
	   flag=false;
	}
	
}
void turn(int n){//翻转函数
	//翻转第一次
	int low=1,high=conut;
	if(conut!=1){//最上面和不用翻转
	    while(low<=high){
	    	int temp=a[low];
			a[low]=a[high];
			a[high]=temp;
			low++;
			high--; 
		}
//         print(n) 
		ans++;
	}
	juge(n);//判断是否从小到大有序
	if(flag==false){
	return ;
	}
	//翻转第二次 
	low=1,high=n-dex;
	while(low<=high){
    	int temp=a[low];
		a[low]=a[high];
		a[high]=temp;
		low++;
		high--;
	}
//	print(n);
	ans++;
	juge(n);//判断是否从小到大有序 
	dex++;
}
void find(int n){//查找元素 
    int max=-1;
    for(int i=1;i<=n-dex;i++){
     	if(a[i]>=max){
     		max=a[i];
     		conut=i;
		}
	}
	if(conut==n-dex){//目前位置已经是最大位置 
		dex++;
		find(n);	
	}
	else 
	return ;
} 
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	juge(n);//判断是否从小到大有序 防止BUG 
	while(flag&&dex!=n-1){
		find(n);
		turn(n);
	}
	printf("%d\n",ans);
} 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值