0
点赞
收藏
分享

微信扫一扫

煎饼C++代码

上古神龙 2022-01-26 阅读 86
c++
煎饼
时间限制 : 10000 MS   空间限制 : 65536 KB

问题描述

有一叠煎饼正在锅里。煎饼共有n(n<=30)张,每张饼都有一个数字,代表它的大小,每个饼的大小都不同。厨师每次可以选一个数字k,把从锅底开始数第k张上面的煎饼(包括第k张)全部翻过来,即原来在上面的煎饼现在到了下面。
例如,一开始一叠煎饼如下:
5
1
2
3
4
第一次,厨师选了数字1,把第1张饼开始往上面的饼都翻了过来,得到下面一叠饼
4
3
2
1
5
第二次,厨师选了数字2,把第2张饼开始往上的所有饼都翻转了过来,得到下面一叠饼
1
2
3
4
5


给出最开始一叠饼的形态,请你设计一种翻转方法使得所有饼从上往下按从小到大的顺序排列。

输入格式

第一行,一个数字n表示饼的个数
第二行,n个空格间隔的整数,表示从上往下每个饼的大小

输出格式

第一行,一个整数,表示最少翻动的次数

第二行,若干个数字,每个数字表示一次翻动的位置。若一次都不需要翻转,直接输出0

样例输入

5
5 1 2 3 4

样例输出

2
1 2

提示

1<=饼上的数字<=100

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a[105],b[105],ans[105],cnt=0;
	cin>>n;
	int i,j,k;
	for(i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+n+1);
	for(i=n;i>=1;i--){
		if(a[i]!=b[i]&&a[1]==b[i]){
			cnt++;
			ans[cnt]=n-i+1;
			for(j=1;j<=i/2;j++)	swap(a[j],a[i-j+1]);
		}
		else if(a[i]!=b[i]&&a[1]!=b[i]){
			for(j=2;j<=n;j++)	if(a[j]==b[i])	break;
			cnt++;
			ans[cnt]=n-j+1;
			for(k=1;k<=j/2;k++)	swap(a[k],a[j-k+1]);
			cnt++;
			ans[cnt]=n-i+1;
			for(k=1;k<=i/2;k++)	swap(a[k],a[i-k+1]);
		}
	}
	if(cnt==0){
		cout<<"0";
		return 0;
	}
	cout<<cnt<<endl;
	for(int i=1;i<=cnt;i++)
		cout<<ans[i]<<" ";
	return 0;
} 
举报

相关推荐

969. 煎饼排序

969.煎饼排序

打怪C++代码

【C++代码】链表

C++代码重构

Minesweeper(c++代码)

蓝屏代码(C++)

C++常见代码

0 条评论