zoj 1201 Inversion

这道题的意思是说,输入一数列,如果前面是‘P’,则就该数列各个数的逆序对输出,输入‘I’则将原来的数列输出。第一种情况比较好处理,第二种有点小麻烦。

第二种情况要符合下面两个要求:

1、先找到a[i]中最小的放在开头;

2、i前面要有a[i]个比i大的数;

代码:

 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<iostream>
5 using namespace std;
6 int a[102],b[102];
7 int jude(int x,int y)
8 {
9 int i,s=0;
10 for(i=1;i<=y;i++)
11 if(b[i]>x)//查找在y之前有几个是大于x的
12 s++;
13 if(s==a[x])//如果在y之前大于x的数正好等于a[x],则返回1;
14 return 1;
15 return 0;
16 }
17 int main()
18 {
19 int t,i,j;
20 char m;
21 while(scanf("%d",&t),t)
22 {
23 cin>>m;
24 memset(a,0,sizeof(a));
25 memset(b,0,sizeof(b));
26 for(i=1;i<=t;i++)
27 cin>>a[i];
28 if(m=='P')
29 {
30 for(i=1;i<=t;i++)
31 {
32 for(j=1;j<i;j++)
33 if(a[i]<a[j])
34 b[a[i]]++;
35 }
36 }
37 else
38 {
39 for(i=1;i<=t;i++)
40 {
41 for(j=1;j<=t;j++)
42 {
43 if(a[j]<i&&jude(j,i))//依次找a中最小的数,并判断是否符合要求。
44 {
45 b[i]=j;
46 a[j]=1000000;
47 break;
48 }
49 }
50 }
51 }
52 for(i=1;i<=t;i++)
53 {
54 if(i==1)
55 cout<<b[i];
56 else
57 cout<<" "<<b[i];
58 }
59 cout<<endl;
60 }
61 return 0;
62 }

 

posted @ 2011-12-02 19:28  Misty_1  阅读(280)  评论(0编辑  收藏  举报