zoukankan      html  css  js  c++  java
  • UVa 120 (构造) Stacks of Flapjacks

    这题求解的过程和选择排序非常相似。

    反转的过程中分为无序(在前面)和有序(在后面)两个部分,一开始视为全部为无序。

    在无序部分中找到最大的元素,先把它翻到最前面,然后再反转到无序部分的最后面。这样该元素就成为有序的部分。

    而且在算法执行的过程中不会影响到已经构造好的有序部分。

     1 #include <iostream>
     2 #include <string>
     3 #include <sstream>
     4 #include <algorithm>
     5 #include <cstdio>
     6 using namespace std;
     7 
     8 const int maxn = 30 + 5;
     9 int n, a[maxn];
    10 
    11 void flip(int p)
    12 {
    13     for(int i = 0; i < p - i; ++i) swap(a[i], a[p-i]);
    14     printf("%d ", n-p);
    15 }
    16 
    17 int main()
    18 {
    19     string s;
    20     while(getline(cin, s))
    21     {
    22         cout << s << "
    ";
    23         stringstream ss(s);
    24         n = 0;
    25         while(ss >> a[n]) n++;
    26         for(int i = n-1; i > 0; --i)
    27         {
    28             int p = max_element(a, a+i+1) - a;
    29             if(p == i) continue;
    30             if(p > 0) flip(p);
    31             flip(i);
    32         }
    33         puts("0");
    34     }
    35 
    36     return 0;
    37 }
    代码君
  • 相关阅读:
    Shell命令之文本操作
    乘法表
    万年历
    猜数游戏
    Linux下如何进行FTP安装与设置
    CentOS 安装nload(流量统计)
    linux下创建用户并且限定用户主目录
    ftp 解决不能上传问题
    【题解】[TJOI2018]数学计算
    【平衡树做题记录】
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4272299.html
Copyright © 2011-2022 走看看