UVA ~ 120 ~ Stacks of Flapjacks(思维+STL容器)

本文介绍了一种通过特定翻转操作实现序列从小到大排序的算法,并提供了完整的C++实现代码。该算法采用类似选择排序的方法,逐步将序列中最大的元素翻转至正确位置,直至整个序列有序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:输入一组数(不知道多少个),你要把这些数字通过指定的操作变为有序的(必须为从小到大)

操作:flip(n).将第n个数字到最上面的这个序列反转,(从下往上查)

比如 5 这个序列进行flip(1)得到 1 。

         4                                            2

         3                                            3

         2                                            4

         1                                            5

输出为先输出一边原序列,然后在输出操作顺序,使序列变得符合要求;

思路:其实这个思路是跟选择排序的思想一样的,我们先将最下面的变为最大的,然后将第二大的放在最大的上面,一步步使这个序列有序;

主要是对输入的处理比较麻烦,不告诉我们要输入几个数字。。。写的时候参考了网上的一篇文章(作者为:泥瓦匠BYSocket),所以代码基本一样;


#include<bits/stdc++.h>
using namespace std;
int main()
{
	for(string strline; getline(cin,strline); cout<<"0"<<endl) //很奇怪的循环结构,学到了 
	{
		cout << strline << endl;//输出原始序列 
		stringstream S(strline);
		deque <int> dq;
		for(int num; S >> num; dq.push_front(num)) ;//将这些数字反序导入dq 
		for(deque<int>::iterator it = dq.begin(); it != dq.end(); it++)
		{
			deque<int>::iterator iMax = max_element(it,dq.end());//找到从it位置到结尾最大的元素位置 
			if(iMax != it)//如果不是it 
			{
				if(iMax != dq.end() - 1)//如果最大值位置不在最上面 
				{
					reverse(iMax,dq.end());//将最大值翻到最上面 
					cout << distance(dq.begin(),iMax) + 1 <<" ";//输出操作 
				}
				reverse(it,dq.end());//将it到最上面反转 
				cout << distance(dq.begin(),it) + 1 << ' ';//输出操作 
			}
		}
		
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值