uva 120 C - Stacks of Flapjacks

题意:给一个n长度的子序列,每次可以把从下往上数,第几个及上面的都反转过来,最后序列变为上升子序列

分析:可以每次把当前最大的放到下面,这样以后无论如何翻动都不会干扰到他,直到得到答案

题目没有要求最优解,这样肯定能得到结果,借助函数reverse反转数组效果不错,没难度,见代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=35;
 4 
 5 struct point{
 6    int id,x;
 7 }p[maxn];
 8 
 9 bool cmp(point a,point b){
10    return a.x<b.x;
11 }
12 
13 int num[maxn];
14 
15 int main(){
16    int n,d;
17    string line;
18    while(getline(cin,line)){
19       stringstream ccin(line);
20       n=0;
21       while(ccin>>d){
22          p[n].x=d;
23          p[n].id=n+1;
24          n++;
25       }
26       for(int i=0;i<n-1;i++)
27          cout<<p[i].x<<" ";
28       cout<<p[n-1].x<<endl;
29       sort(p,p+n,cmp);
30       for(int i=0;i<n;i++)
31          num[p[i].id-1]=i+1;
32       int ans=n;
33       while(n>1){
34          int i;
35          for(i=n-1;i>=0;i--)
36             if(num[i]==n)
37                break;
38          if(i==0){
39             reverse(num,num+n);
40             n--;
41             cout<<ans-n<<" ";
42          }
43          else if(i==n-1)
44             n--;
45          else{
46             cout<<ans-i<<" ";
47             reverse(num,num+i+1);
48             reverse(num,num+n);
49             n--;
50             cout<<ans-n<<" ";
51          }
52 
53       }
54       cout<<0<<endl;
55    }
56    return 0;
57 }
View Code

 

posted @ 2015-11-24 20:13  N维解析几何  阅读(162)  评论(0编辑  收藏  举报