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