POJ 3705

题意:通过复制粘贴将正序序列变成逆序序列,要求步骤最少。

题解:分奇偶讨论,若是奇数,则反复的将最大的那数前面的偶数个数的中间两个挪到后面相应位置,如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

这样做可以使得每次移动都形成两个降序序列。

View Code
 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 }

 

你可能感兴趣的:(poj)