题意:通过复制粘贴将正序序列变成逆序序列,要求步骤最少。
题解:分奇偶讨论,若是奇数,则反复的将最大的那数前面的偶数个数的中间两个挪到后面相应位置,如n=7
1 2 3 4 5 6 7
1 2 5 6 7 3 4
1 6 7 3 2 5 4
7 3 2 1 6 5 4
这样做可以使得每次移动都形成两个降序序列。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int n; 8 while(scanf("%d",&n)!=EOF) 9 { 10 if(n==1) 11 { 12 printf("0\n"); 13 continue; 14 } 15 else if(n==2) 16 { 17 printf("1\n"); 18 printf("1 1 1\n"); 19 continue; 20 } 21 int pos,nn=n,t=0; 22 if(nn&1) 23 { 24 printf("%d\n",(nn+1)>>1); 25 while(nn>2) 26 { 27 pos=(nn-1)>>1; 28 printf("%d 2 %d\n",pos,nn+t-2); 29 t++; 30 nn-=2; 31 } 32 printf("%d %d 1\n",nn+t+1,t); 33 } 34 else 35 { 36 nn--; 37 printf("%d\n",n/2+1); 38 while(nn>2) 39 { 40 pos=(nn-1)>>1; 41 printf("%d 2 %d\n",pos,nn+t-2); 42 t++; 43 nn-=2; 44 } 45 printf("%d %d 1\n",nn+t+1,t); 46 printf("%d 1 0\n",n); 47 } 48 } 49 return 0; 50 }