POJ1804-Brainman

转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1304317886

 

大致题意:

POJ2299一摸一样,区别在于数据规模缩小了而已

 

解题思路:

重申一次:

一个乱序序列的 逆序数 = 在只允许相邻两个元素交换的条件下,得到有序序列的交换次数

 

若想通过借助归并排序求逆序数

可以参看我POJ2299的思路,几乎一模一样的程序,O(nlogn)算法

http://user.qzone.qq.com/289065406/blog/1304259927

不过由于规模的缩小,全部变量用int即可

 

这题也可以直接求逆序数,无需借助归并排序

S[i]s[i+1~n]的元素逐个比较,如果s[i] > s[k] (k[i+1,n]) 则逆序数t++  O(n^2)算法

 1 /*借助Mergesort求逆序数O(nlogn)*/
2
3 //Memory Time
4 //228K 172MS
5
6 #include<iostream>
7 using namespace std;
8
9 const int inf=1000001;
10 int t; //数字序列s[]的逆序数
11
12 void compute_t(int* s,int top,int mid,int end)
13 {
14 int len1=mid-top+1;
15 int len2=end-mid;
16
17 int* left=new int[len1+2];
18 int* right=new int[len2+2];
19
20 int i,j;
21 for(i=1;i<=len1;i++)
22 left[i]=s[top+i-1];
23 left[len1+1]=inf;
24
25 for(j=1;j<=len2;j++)
26 right[j]=s[mid+j];
27 right[len2+1]=inf;
28
29 i=j=1;
30 for(int k=top;k<=end;k++)
31 if(left[i]<=right[j])
32 s[k]=left[i++];
33 else
34 {
35 s[k]=right[j++];
36 t+=len1-i+1;
37 }
38
39 delete left;
40 delete right;
41
42 return;
43 }
44
45 void mergesort(int* s,int top,int end)
46 {
47 if(top<end)
48 {
49 int mid=(top+end)/2;
50 mergesort(s,top,mid);
51 mergesort(s,mid+1,end);
52 compute_t(s,top,mid,end);
53 }
54 return;
55 }
56 int main(void)
57 {
58 int test;
59 cin>>test;
60 for(int p=1;p<=test;p++)
61 {
62 int n; //数字序列s[]长度
63 cin>>n;
64
65 int* s=new int[n+1];
66
67 for(int i=1;i<=n;i++)
68 cin>>s[i];
69
70 t=0;
71 mergesort(s,1,n);
72
73 cout<<"Scenario #"<<p<<':'<<endl<<t<<endl<<endl;
74
75 delete s;
76 }
77 return 0;
78 }

 

=============华丽的分割线=============

 

 1 /*直接求逆序数O(n^2)*/
2
3 //Memory Time
4 //220K 188MS
5
6 #include <iostream>
7 using namespace std;
8
9 int main(int i,int j)
10 {
11 int test;
12 cin>>test;
13 for(int p=1;p<=test;p++)
14 {
15 int n;
16 cin>>n;
17
18 int* s=new int[n+1];
19 for(i=1;i<=n;i++)
20 cin>>s[i];
21
22 int t=0; //s[]的逆序数
23 for(i=1;i<=n-1;i++) //把S[i]和s[i+1~n]的元素逐个比较
24 for(j=i+1;j<=n;j++)
25 if(s[i]>s[j]) //如果s[i] > s[j] (j∈[i+1,n])
26 t++; //则逆序数t++
27
28 cout<<"Scenario #"<<p<<':'<<endl<<t<<endl<<endl;
29
30 delete s;
31 }
32 return 0;
33 }

你可能感兴趣的:(poj)