UVa 120 Stacks of Flapjacks【构造法】

题意:给出n张煎饼,从上到下输入,每张煎饼上面都有一个数字,厨师每次可以选择第k张煎饼,进行翻转操作,设计一种方法使得所有煎饼按照从小到大排序(最上面的煎饼最小)

首先是这个翻转的操作,如下图

UVa 120 Stacks of Flapjacks【构造法】_第1张图片

 

 

如图所示:是把7以上的翻转,再把7以下的翻转

 

 

 

然后就是怎样找到去翻转哪张饼 以找最大的为例 即现在在煎饼的序列中找到最大的饼的序号,

判断序号是否与煎饼上的数字对应得上(即判断这个煎饼有没有放对位置)

如果没有放对位置

判断它是否已经在0位置(即顶部)

如果不在,

则将它翻转到0位置

如果在,则不用管

最后,再将它翻下去,到达它应该在的位置

如图 输入 2 1 5 3 4

UVa 120 Stacks of Flapjacks【构造法】_第2张图片

先找到最大的5,把它翻到顶上去,再把它翻下来

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<sstream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int maxn=10005;
 8 int a[maxn];
 9 int n;
10 
11 void flip(int p){
12     for(int i=0;i<p-i;i++) swap(a[i],a[p-i]);
13 
14     printf("%d ",n-p);    
15 }
16 
17 
18 
19 int main(){
20     string s;
21     while(getline(cin,s)){
22         cout<<s<<"\n";
23         stringstream ss(s) ;
24         n=0;
25         while(ss>>a[n]) n++;    
26                 
27         for(int i=n-1;i>0;i--){
28             int p=max_element(a,a+i+1)-a;//找到最大的数的下标 
29         
30             if(p==i) continue;//如果这块饼的位置是对的,就不管 
31             if(p>0) flip(p);//如果饼不是在0位置,那么将这块饼 翻到0位置 
32             flip(i);//将这块 饼翻到它应该在的位置 
33         }
34         printf("0\n");
35     }
36     return 0;
37 }
View Code

 

 

 

 

 

 

自己写的代码不仅不忍直视= =还运行不出结果,最后还是看的lrj的代码 = =

go---go---go

 

你可能感兴趣的:(stack)