题意:给出n张煎饼,从上到下输入,每张煎饼上面都有一个数字,厨师每次可以选择第k张煎饼,进行翻转操作,设计一种方法使得所有煎饼按照从小到大排序(最上面的煎饼最小)
首先是这个翻转的操作,如下图
如图所示:是把7以上的翻转,再把7以下的翻转
然后就是怎样找到去翻转哪张饼 以找最大的为例 即现在在煎饼的序列中找到最大的饼的序号,
判断序号是否与煎饼上的数字对应得上(即判断这个煎饼有没有放对位置)
如果没有放对位置
判断它是否已经在0位置(即顶部)
如果不在,
则将它翻转到0位置
如果在,则不用管
最后,再将它翻下去,到达它应该在的位置
如图 输入 2 1 5 3 4
先找到最大的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<<" "; 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 "); 35 } 36 return 0; 37 }
自己写的代码不仅不忍直视= =还运行不出结果,最后还是看的lrj的代码 = =
go---go---go