uva Stacks of Flapjacks
题目链接:Click Here~
题目描写叙述:
给你n个数。要你得到的最后结果是从下到大排序。可是给出的序列不一定是有序你。要通过你的调整。问:要经过哪几个位置上的数的调整?
算法分析:
一開始,我的思路是直接模拟一边消除逆序数就能够了,由于我看数据非常小,仅仅有30.可是提交之后却TEL了。
后来上网查了一下。看到有一个人的思路还是非常好的。就是说运用到了动态规划的思想。
确实非常巧妙啊!
思路:在查询到当前第i个数的时候,你必须保证其后面的数是有序的,且都比i大。仅仅要保证了这一个条件之后,我们能够从快排的思想得知这是正确的。
但是怎样能够实现呢?事实上也非常easy。比方,但前你查询到了第i个了,但是第i个不满足条件。并且这是后又有两种情况。
(第i个数本应该的数在哪里?)1、可能就在最前面,那个此时你能够直接Flip操作就能够了。
2、不再最前面,此时你能够先找到最大数的位置,然后先将最大数Flip操作实现其到最前面,然后再实现操作1就OK了。
例:
2 4 1 3 5
此时我们查询到了3这个位置,你会发现3这个位置本来应该是4的可是如今不是,所以你要进行Flip操作。可是你有发现4不再最前面,即使你实现了Flip操作也得不到正确结果。
所以,你要先把4Flip到最前面,即2的位置。
4 2 1 3 5
之后在Flip得到
3 1 2 4 5
。
。。。
。。这样一直查询下去,O(n)的算法复杂度实现就能够了。
#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>
#include <sstream>
#include <deque>
#include <vector>
#include <cstdio>
using namespace std; int main()
{
string line;
while(getline(cin,line))
{
int x;
deque<int> deq;
deque<int>::iterator iter;
istringstream ss(line);
while(ss>>x){
deq.push_front(x);
cout<<x<<" ";
}
cout<<endl;
for(iter = deq.begin();iter != deq.end();++iter){
deque<int>::iterator iMax = max_element(iter,deq.end());
if(iter != iMax){ //当前这个数的位置不应该待在这
if(iMax != deq.end()-1){ //最大数不再最前面(操作1)
reverse(iMax,deq.end());
cout<<distance(deq.begin(),iMax)+1<<' ';
}
reverse(iter,deq.end()); //操作2
cout<<distance(deq.begin(),iter)+1<<' ';
}
}
cout<<"0"<<endl;
}
return 0;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
uva Stacks of Flapjacks的更多相关文章
- UVA Stacks of Flapjacks 栈排序
题意:给一个整数序列,输出每次反转的位置,输出0代表排序完成.给一个序列1 2 3 4 5,这5就是栈底,1是顶,底到顶的位置是从1~5,每次反转是指从左数第i个位置,将其及其左边所有的数字都反转,假 ...
- Uva 120 - Stacks of Flapjacks(构造法)
UVA - 120 Stacks of Flapjacks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld &a ...
- uva 120 stacks of flapjacks ——yhx
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data ...
- UVaOJ 120 - Stacks of Flapjacks
120 - Stacks of Flapjacks 题目看了半天......英语啊!!! 好久没做题...循环输入数字都搞了半天...罪过啊!!! 还是C方便一点...其实C++应该更方便的...C+ ...
- 【思维】Stacks of Flapjacks
[UVa120] Stacks of Flapjacks 算法入门经典第8章8-1 (P236) 题目大意:有一个序列,可以翻转[1,k],构造一种方案使得序列升序排列. 试题分析:从插入排序即可找到 ...
- Stacks of Flapjacks(栈)
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data ...
- Stacks of Flapjacks
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data s ...
- (白书训练计划)UVa 120 Stacks of Flapjacks(构造法)
题目地址:UVa 120 水题. 从最大的開始移,每次都把大的先翻到最上面,再翻到以下. 代码例如以下: #include <iostream> #include <cstdio&g ...
- B - Stacks of Flapjacks UVA - 120
BackgroundStacks and Queues are often considered the bread and butter of data structures and find us ...
随机推荐
- P - Shopaholic
P - Shopaholic Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit ...
- mysql 正确的关闭方式
./bin/mysqladmin -uroot -p123456 -S /home/allen/var/mysql/mysql.sock shutdown
- 关于XPath的基本语法
关于XPath基础语法 关于XPath基础语法 更详细的请看: XPath语法 XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) ...
- Decorators and Wrappers in Python
python代码一贯以优雅,简洁著称,而有时侯反而会让人难以理解,比如说wrapper(或者说decorator),这种方式提高了代码的可重用性,使用起来更简洁方便. 举个例子,比如WebApp常用的 ...
- Day 1: How to install jedi/codeintel plugin for sublime on Linux
Step 1, Install sublime3 Download sublime2/3 from http://www.sublimetext.com/ $tar -jxvf sublime_tex ...
- C语言2
函数是C语言的基本单位,类是java,c#,c++的基本单位 int abs(int x); double fabs(double x); 按变量的存储方式:静态变量.自动变量.寄存器变量 指针就 ...
- Linux系统管理员:不要害怕升级内核
Linux系统管理员平时很重要的一项工作就是负责系统内核升级.做好系统内核的升级工作,对于Linux系 统的稳定性具有至关重要的作用.但是很少有人敢贸然的对Linux系统的内核进行升级,担心会影响现有 ...
- python import 自己的包
在写python时,有时候写的一个python文件可能需要被其他python文件所用,那么可以用导入包 import 的 方式: 1.自己写的包放到哪里? >>> import sy ...
- 一步一步学android之控件篇——ScrollView
一个手机的屏幕大小是有限的,那么我要显示的东西显示不下怎么办?这就会使用到ScrollView来进行滚动显示,他的定义如下: 可以看到ScrollView是继承于FrameLayout的,所以Scro ...
- css学习笔记四
广州天气变冷了,css学习笔记还是要总结. 总结: 1:几米页面静态页面主要是一列结构头部banner图,mainbody部分放文字内容和图书图片,底部是页面的版权信息 2:腾讯软件中心静态页面制作( ...