poj 1804:Brainman

解題思路:

歸併排序

#include<iostream>
using namespace std;

const int inf = 2000001;

int v[2010];
int t[2010];
int m,n;
int ans = 0;

void msort(int l,int r)
{
	int mid = (l+r)/2;
	int s1 = l;
	int s2 = mid + 1;
	int s3 = 0;
	while(s1<=mid && s2<=r)
	{
		if(v[s1]<=v[s2])
		{
			t[s3] = v[s1];
			s3++;
			s1++;
		}
		else if(v[s2]<v[s1])
		{
			t[s3] = v[s2];
			s3++;
			s2++;
			ans += mid - s1 + 1; 
		}
	}
	if(s1<=mid)
		for(int i=s1;i<=mid;i++)
		{
			t[s3] = v[i];
			s3++;
		}
	if(s2<=r)
		for(int i=s2;i<=r;i++)
		{
			t[s3] = v[i];
			s3++;
		}
	int s4 = l;
	for(int i=0;i<s3;i++)
	{
		v[s4] = t[i];
		s4++;
	}
	return;
}

int main()
{
	cin>>m;
	int ex = 0;
	while(m--)
	{
		cin>>n;
		ans = 0;
		ex++;
		for(int i=0;i<1010;i++)
			v[i] = inf;
		for(int i=0;i<n;i++)
			cin>>v[i];
		int k = 2;
		while(k<2*n)
		{
			for(int i=0;i<n;i+=k)
				msort(i,i+k-1);
			k = k*2;
		}
		cout<<"Scenario #"<<ex<<":"<<endl;
		cout<<ans<<endl<<endl;
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章