首页 > 代码库 > UVa120 Stacks of Flapjacks (构造法)

UVa120 Stacks of Flapjacks (构造法)

链接:http://vjudge.net/problem/18284

分析:摊煎饼问题。以从大到小的顺序依次把每个数排到正确的位置,比如当处理第i大的煎饼时,是不会影响到第1,2,3,...,i-1大的煎饼的(它们已经正确的翻到了煎饼堆底部的i-1个位置上),翻煎饼的方法是先翻到最上面,然后翻到正确的位置,翻好了以后煎饼堆底部i个位置上的煎饼都已经正确放好就不用管了,接下来就是找第i+1大的煎饼放到下数上第i+1个位置上,不过对于当前最大煎饼的位置要分类讨论,如果已经在其正确位置上就什么也不用做,如果在最顶上,就只需翻一次到正确位置上,否则先翻到最顶上然后再翻到正确位置。

 

 1 #include <string> 2 #include <iostream> 3 #include <sstream> 4 using namespace std; 5  6 const int maxn = 30 + 5; 7  8 int n, a[maxn]; 9 10 void flip(int p) {11     for (int i = 0; i < p - i; i++)12         swap(a[i], a[p - i]);13     printf("%d ", n - p);14 }15 16 int main() {17     string s;18     while (getline(cin, s)) {19         cout << s << endl;20         stringstream ss(s);21         n = 0;22         while (ss >> a[n]) n++;23         for (int i = n - 1; i > 0; i--) {24             int maxv = a[i], index = i;25             for (int j = i - 1; j >= 0; j--)26                 if (a[j] > maxv) {27                     maxv = a[j];28                     index = j;29                 }30             if (index == i) continue;31             if (index > 0) flip(index);32             flip(i);33         }34         printf("0\n");35     }36     return 0;37 }

 

UVa120 Stacks of Flapjacks (构造法)