• uva Stacks of Flapjacks


    

                                                    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;
    }
    
    





    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    python中的对象
    在python中是没有NULL的,取而代之的是None,它的含义是为空
    Python将列表作为栈和队列
    Python的数据类型3元组,集合和字典
    1
    Python的数据类型2列表
    _Python定义方法
    IDEA
    Docker-compose.yml 基础使用
    Nginx 前后端分离, 多个二级域名配置
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4800173.html
Copyright © 2020-2023  润新知