| 比赛 | 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]);
}