Problem :http://acm.hrbeu.edu.cn/index.php?act=problem&proid=5001
题意:
对于这样的一个数列{A1,A2,A3,A4,A5}叫permutation
如果对于i<j,Ai>Aj;则称其为一对倒置对,如{3,1,4,2}有(3,1)(3,2)(4,2)是它的一些倒置对;
对于另一个数列{B1,B2,B3,B4,B5}叫做inversion table
如果对于i,每个Bi表示在i左边并大于i的个数;如 有一数列A={5,9,1,8,2,6,4,7,3},则对于这一数列的inversion table 为(2 3 6 4 0 2 2 1 0) 其中B2=3,表示在A中比2大且在其左边的数有3个,即(5,9,8);
题目要求:
给出一个permutation,求出inversion table或给出inversiontable求permutation;
解题思路:
题目要分两种分别计算,P和I的不同情况
如果是P,则对每一个数计算它前面有几个比它大的,然后在数组中它的位置里记下这个数
如果是I,则应该从1开始算,每次找到数的正确位置,将这个数放入数组位置中。
Code:
Code
1 #include<stdio.h>
2 #include<string.h>
3 int main()
4 {
5 int n;
6 while(scanf("%d",&n)!=EOF&&n)
7 {
8 getchar();
9 char ch;
10 scanf("%c",&ch);
11 int a[55],b[55];
12 for(int i=0;i<n;i++)
13 scanf("%d",&a[i]);
14 if(ch=='P')
15 {
16 memset(b,0,sizeof(b));
17 for(int k=0;k<n;k++)
18 {
19 for(int i=0;i<k;i++)
20 {
21 if(a[k]<a[i])
22 b[a[k]-1]++;
23 }
24 }
25 }
26 else if(ch=='I')
27 {
28 memset(b,-1,sizeof(b));
29 for(int k=0;k<n;k++)
30 {
31 int m=0;
32 for(int i=0;i<n;i++)
33 {
34 if(b[i]==-1)
35 m++;
36 if(a[k]==m-1)
37 {
38 b[i]=k+1;
39 break;
40 }
41 }
42 }
43 }
44 printf("%d",b[0]);
45 for(int i=1;i<n;i++)
46 printf(" %d",b[i]);
47 printf("\n");
48 }
49 }
50