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 << "\n";
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 }
代码君

 

posted @ 2015-02-04 14:36  AOQNRMGYXLMV  阅读(163)  评论(0编辑  收藏  举报