UVa120 Stacks of Flapjacks (构造法)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 (构造法)的主要内容,如果未能解决你的问题,请参考以下文章
UVA - 120Stacks of Flapjacks (摊煎饼。。)
UVa120 Stacks of Flapjacks (构造法)