[noip 2004]火星人

题目:http://www.leapoahead.com/acm/problem.php?cid=1002&pid=3

就是今天正式赛的题目

思路:由所给排列生成接下来的排列中第m个排列,考虑18!很大,多以都用了64位储存

网上查阅了相关知识,知道了大概生成思路,然后写出来

最开始还进入了几次死循环

 1 #include<stdio.h>
 2 __int64 n,m,a[10000];
 3 
 4 void swap(__int64 * x,__int64 * y)//要求传入的是全局变量
 5 {
 6     __int64 t;
 7     t=*x;
 8     *x=*y;
 9     *y=t;
10 }
11 
12 void fan(__int64 * x)
13 {
14     __int64 * p1,* p2;
15     p1=x;
16     p2=a+n-1;
17     while(p1<p2)
18     {
19         swap(p1,p2);
20         p1++;
21         p2--;
22     }
23 }
24 
25 void next()//循环使用上可能有些怪,但不想改了
26 {
27     __int64 * p1,* p2,* p3;
28     p1=a+(n-2);
29     p2=p1+1;
30     while(1)
31     {
32         if(*p1<*p2)
33         {
34             p3=a+n-1;
35             while(1)
36             {
37                 if(*p1<*p3)
38                 {
39                     swap(p1,p3);
40                     fan(p2);
41                     break;
42                 }
43                 else p3--;
44             }
45             break;
46         }
47         else
48         {
49             p1--;
50             p2--;
51         }
52     }
53 }
54 
55 __int64 main()
56 {
57     __int64 i;
58     scanf("%I64d",&n);
59     scanf("%I64d",&m);
60     for(i=0;i<n;i++)
61     {
62         scanf("%I64d",&a[i]);
63     }
64     for(i=0;i<m;i++)
65     {
66         next();
67     }
68     for(i=0;i<n;i++)
69     {
70         printf("%I64d",a[i]);
71         if(i!=n-1) printf(" ");
72     }
73     return 0;
74 }

 

posted @ 2012-12-31 03:05  tjsuhst  阅读(335)  评论(0编辑  收藏  举报