这个题唯一坑爹的地方就是UVA给的udebug数据是错的,害得我头疼了半天。。。
思路就是依次找最大的数把它转到最低端,每次执行的时候判断一下是否已经符合题意,符合则跳出循环。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <vector> 6 7 using namespace std; 8 int a[35]; 9 10 int judge(int k) 11 { 12 int i; 13 for(i=0; i<k-1; i++) 14 { 15 if(a[i]>a[i+1]) 16 return 0; 17 } 18 return 1; 19 } 20 int Max(int k,int num) 21 { 22 int i,t; 23 int maxn = -1; 24 for(i=0; i<k; i++) 25 if(a[i]>maxn) 26 { 27 maxn = a[i]; 28 t=i; 29 } 30 if(t==k-1) 31 return 0; 32 else 33 return num-t; 34 } 35 int main() 36 { 37 int i,j,k=0; 38 char c; 39 while(scanf("%d",&a[k++])!=EOF) 40 { 41 while(getchar()!=‘\n‘) 42 scanf("%d",&a[k++]); 43 int num = k; 44 for(i=0; i<k; i++) 45 { 46 if(i==0) 47 printf("%d",a[i]); 48 else 49 printf(" %d",a[i]); 50 } 51 printf("\n"); 52 int flag = 0; 53 int t=1; 54 while(judge(num)==0) 55 { 56 57 if(k==1)break; 58 if(!Max(k,num)) 59 { 60 k--; 61 t++; 62 continue; 63 } 64 flag++; 65 if(Max(k,num)==num) 66 { 67 if(flag==1) 68 printf("%d",t); 69 else 70 printf(" %d",t); 71 t++; 72 for(i=0; i<(num-t+1)/2+1; i++) 73 { 74 int m=a[i]; 75 a[i] = a[num-t+1-i]; 76 a[num-t+1-i] = m; 77 } 78 k--; 79 continue; 80 } 81 if(flag==1) 82 printf("%d",Max(k,num)); 83 else 84 printf(" %d",Max(k,num)); 85 int q = Max(k,num); 86 for(i=0; i<(num-q+1)/2; i++) 87 { 88 89 int m=a[i]; 90 a[i] = a[num-q-i]; 91 a[num-q-i] = m; 92 } 93 } 94 if(flag) 95 cout << " 0" << endl; 96 else 97 cout << "0" << endl; 98 k=0; 99 } 100 return 0; 101 }
时间: 2024-10-19 19:22:07