比赛 20110724 评测结果 AWWWWWWWWW
题目名称 并行 最终得分 10
用户昵称 Citron酱 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-24 12:13:17
显示代码纯文本
#include <fstream>
#include <cstdlib>
#include <climits>

#define I_F "parellel.in"
#define O_F "parellel.out"
#define MAXn (10000+1)

using namespace std;

ifstream fin(I_F);
ofstream fout(O_F);

void Input(int,int*,int*);
void Swap(int&,int&);
void Qsort(int*,int,int);
inline int Abs(int);
void Getg(int,int*,int*,int*);
inline int Min(int,int);
int Dynap(int,int*,int*,int*);

int main()
{
	int n;
	int d1[MAXn],d2[MAXn];
	int g[MAXn];
	int ans;
	fin>>n;
	while (n>0)
	{
		Input(n,d1,d2);
		Qsort(d1,1,n),
		Qsort(d2,1,n-1);
		Getg(n,d1,d2,g);
		ans=Dynap(n,d1,d2,g);
		fout<<ans<<'\n';
		fin>>n;
	}
	fin.close();
	fout.close();
	return 0;
}

void Input(int n, int d1[MAXn], int d2[MAXn])
{
	for (int i=1; i<=n; i++)
		fin>>d1[i];
	for (int i=1; i<n; i++)
		fin>>d2[i];
}

void Swap(int &a, int &b)
{
	int t=a;
	a=b;
	b=t;
}

void Qsort(int s[MAXn], int l, int r)
{
	int x=l+rand()%(r-l+1);
	int i=l, j=r;
	do
	{
		while (s[i]<s[x]) i++;
		while (s[j]>s[x]) j--;
		if (i<=j)
			Swap(s[i++],s[j--]);
	} while (i<j);
	if (i<r) Qsort(s,i,r);
	if (l<j) Qsort(s,l,j);
}

inline int Abs(int x)
{
	return (x<0)?-x:x;
}

void Getg(int n, int d1[MAXn], int d2[MAXn], int g[MAXn])
{
	int t=0,tt;
	for (int i=1; i<=n; i++)
	{
		g[i]=INT_MAX;
		for (int j=t; j<n; j++)
			if (Abs(d1[i]-d2[j])<=g[i])
				g[i]=Abs(d1[i]-d2[j]),
				tt=j;
			else
				break;
		t=tt;
	}
}

inline int Min(int a, int b)
{
	return (a<b)?a:b;
}

int Dynap(int n, int d1[MAXn], int d2[MAXn], int g[MAXn])
{
	int f[MAXn][2];
	f[0][0]=0;
	f[0][1]=1000000;
	for (int i=1; i<n; i++)
	{
		f[i][0]=f[i-1][0]+Abs(d1[i]-d2[i]);
		f[i][1]=Min(f[i-1][1]+Abs(d1[i]-d2[i-1]),f[i-1][0]+g[i]);
	}
	return Min(f[n-1][1]+Abs(d1[n]-d2[n-1]),f[n-1][0]+g[n]);
}