[高效算法 deque运用]UVa120 - Stacks of Flapjacks

15 篇文章 0 订阅

Analysis
分析

算法很简单,给你一组煎饼,用笔在纸上一画就知道该怎么办了。还是动态规划的思想,从底至上,保持已经遍例过的煎饼都是最大且有序的。比如输入的数据为:

2 4 1 3 5

按题目要求,4在顶5在底。5已经是最大的了,则移动到上一个煎饼3。3之上(含)最大的是4,先将4翻转到最顶,形成:

4 2 1 3 5

然后将4到3的子叠翻转,形成:

3 1 2 4 5

移动到上一个煎饼2,2之上(含)最大的是3,而3就在顶部,因此直接将2到3翻转,形成:

2 1 3 4 5

最后将2和1翻转,就完成了。注意:一定不要忘了在输入的一行数据下再将原数据复制输出一行,漏掉必然WA。按照上面的算法来做就不会出现多余的翻转操作,因此不用担心。

 

Solution
解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <algorithm>
#include <iostream>
#include <iterator>
#include <deque>
#include <string>
#include <sstream>
using  namespace  std;
//主函数
int  main( void ) {
     //循环处理输入的每组字符串。每次循环一轮要输出最后的0和换行
     for  (string strLine; getline(cin, strLine); cout << '0'  << endl) {
         //按要求回应输入的字符串行
         cout << strLine << endl;
         //构造字符串流,以遍转换为数字
         istringstream iss(strLine);
         //将字符串转为数字,逆序(最底的在最前)存储在Stack里
         deque< int > Stack;
         for  ( int  nDiam; iss >> nDiam; Stack.push_front(nDiam));
         //从底依次上向进行翻转,保持i上面的都比i小
         for  (deque< int >::iterator i = Stack.begin(); i != Stack.end(); ++i) {
             //找出i上面(包括i)的最大元素
             deque< int >::iterator iMax = max_element(i, Stack.end());
             //如果最大元素就是i则继续(将i指向上面一个)
             if  (iMax != i) { //否则要进行需翻转操作
                 //如果最大的不在最上面,则需先翻转到最上面
                 if  (iMax != Stack.end() - 1) {
                     reverse(iMax, Stack.end());
                     //输出翻转的起点
                     cout << distance(Stack.begin(), iMax) + 1 << ' ' ;
                 }
                 //将最大的从最上面翻转到i的位置上
                 reverse(i, Stack.end());
                 //输出翻转的起点
                 cout << distance(Stack.begin(), i) + 1 << ' ' ;
             }
         }
     }
     return  0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值