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 ...
随机推荐
- ExtJS4.2学习(三)——入门基础
1.怎么给某一组件注册事件? 先画一个组件,然后在控制器中加入对这个组件的处理(包括组件对应的方法调用和方法定义). 2.ExtJS4的提示框和JS的差异: ExtJS4:一步走完程序: JS:让程序 ...
- Linux下Apache重启遇到No space left on device错误的解决方法
解决办法:1.输入:ipcs -s 看有没有超过5个,如果有请执行下面2的命令:2.ipcs -s | perl -ane '/^0x00000000/ && `ipcrm -s ...
- Android开发中如何解决加载大图片时内存溢出的问题
Android开发中如何解决加载大图片时内存溢出的问题 在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...
- hdu 5461 Largest Point
Thinking about it: 对于式子 a * ti * ti + b * tj,可以看作时有两部分构成 a * ti * ti 和 b * tj,如果整个式子要最大,则要求这两部分都要尽量大 ...
- andrewchilds/jQuery.DomOutline
andrewchilds/jQuery.DomOutline DOM - 使用Javascript:让用户选择一个类似Firebug的HTML元素? -
- java的访问控制(包、访问修饰符、修饰符)
一. java的类包 编写好一个源程序后,首先要执行javac命令进行编译源文件,并生成与源文件同名后缀为“.class”的字节码文件(类文件),该类文件与源文件默认在同一个目录中.该类文件是 ...
- Turn the corner (三分)
Turn the corner Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- fastDFS同步问题讨论
一.文件同步延迟问题 前面也讲过fastDFS同组内storage server数据是同步的, Storage server中由专门的线程根据binlog进行文件同步.为了最大程度地避免相互影响以及出 ...
- SQL存储过程动态查询数据区间
以前经常看到人查询数据库采用left join及case方式,一条一条的枚举查询整个数据的数据区间方法可行,但是数据一但很大,枚举就死悄悄,在网上查看,几乎全是照抄case ,left join枚举无 ...
- 在Attribute Inspector 上显示自定义的控件的属性
FirstColor 跟 CornerRadious 都是新增的显示属性具体实现方法如下: @property(nonatomic,weak)IBInspectable UIColor *firstC ...