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 }