[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 }