UVA Stacks of Flapjacks 栈排序

 

题意:给一个整数序列,输出每次反转的位置,输出0代表排序完成。给一个序列1 2 3 4 5,这5就是栈底,1是顶,底到顶的位置是从1~5,每次反转是指从左数第i个位置,将其及其左边所有的数字都反转,假如反转位置2,则1 2 3 4 5就变成 4 3 2 1 5. 问怎样经过最少次数的反转能得到升序12345。

 

思路:每次产生一个最大的数字到右边,经过n次就升序了。每次产生可能需要两次反转,也可能1次就搞定,可能0次。0次是因为该数已经在最终位置上;1次搞定是因为最大数已经在栈顶(最左边),一反转就到达了它最终的位置上;2次是因为最大数不在栈顶,需要经过多一次反转,将它搞到栈顶先,再按1次的情况处理。难度主要在输入输出上。

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <stdio.h>
 5 using namespace std;
 6 int a[50],sorted_b[50];
 7 int main()
 8 {
 9     //freopen("input.txt", "r", stdin);
10     char c;
11     int tmp;
12     while(1)
13     {
14         int i=0;
15         while(scanf("%d", &tmp),c=getchar())
16         {
17             cout<<(a[i]=sorted_b[i]=tmp);
18             i++;
19             if(c=='\n'||c==EOF) break;
20             else    cout<<" ";
21         }
22         printf("\n");
23         sort(sorted_b, sorted_b+i);
24         for(int j=i-1; j>0; j--)
25         {
26             if(sorted_b[j]==a[j])   continue;   //相同则略过
27             if(a[0]!=sorted_b[j])         //如果最大已经在栈顶,省去一次翻转
28             {
29                 int k;
30                 for(k=1; k<j; k++)     //寻找sorted_b[j]
31                 {
32                     if(a[k]==sorted_b[j])   break;
33                 }
34                 cout<<i-k<<" ";             //此位置要翻
35                 reverse(a,a+k+1);
36             }
37             cout<<i-j<<" ";
38             reverse(a,a+j+1);
39         }
40         cout<<"0"<<endl;
41         if(c==EOF) return 0;
42     }
43     return 0;
44 }
AC代码

 

posted @ 2015-04-22 12:59  xcw0754  阅读(144)  评论(0编辑  收藏  举报