#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=10005;
double dp[2][105];// 表示 m n之间的最大差值
int main(){
int m,n;
double a[N],b[N];
while(~scanf("%d%d",&n,&m)&&n+m){
if(n<=m)//保证n为较小值,便于处理
{
for(int i=1; i<=n; i++)
scanf("%lf",&a[i]);
for(int i=1; i<=m; i++)
scanf("%lf",&b[i]);
}
else
{
for(int i=1; i<=n; i++)
scanf("%lf",&b[i]);
for(int i=1; i<=m; i++)
scanf("%lf",&a[i]);
swap(n,m);
}
sort(a+1,a+n+1);
sort(b+1,b+m+1);
int len=m-n+1;//表示m n 之间的错位数
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
dp[i%2][1]=dp[(i-1)%2][1]+fabs(a[i]-b[i]);//表示没有错位之前的差值大小
for(int j=2;j<=len;j++){
int k=i+j-1;
dp[i%2][j]=min(dp[i%2][j-1],dp[(i-1)%2][j]+fabs(a[i]-b[k]));//刷新错位最小值
}
}
printf("%.6lf\n",dp[n%2][len]);//运行的结果就存在dp数组中的最后一位,也就是dp[n%2][len]
}
return 0;
}
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=10005;
double dp[2][105];// 表示 m n之间的最大差值
int main(){
int m,n;
double a[N],b[N];
while(~scanf("%d%d",&n,&m)&&n+m){
if(n<=m)//保证n为较小值,便于处理
{
for(int i=1; i<=n; i++)
scanf("%lf",&a[i]);
for(int i=1; i<=m; i++)
scanf("%lf",&b[i]);
}
else
{
for(int i=1; i<=n; i++)
scanf("%lf",&b[i]);
for(int i=1; i<=m; i++)
scanf("%lf",&a[i]);
swap(n,m);
}
sort(a+1,a+n+1);
sort(b+1,b+m+1);
int len=m-n+1;//表示m n 之间的错位数
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
dp[i%2][1]=dp[(i-1)%2][1]+fabs(a[i]-b[i]);//表示没有错位之前的差值大小
for(int j=2;j<=len;j++){
int k=i+j-1;
dp[i%2][j]=min(dp[i%2][j-1],dp[(i-1)%2][j]+fabs(a[i]-b[k]));//刷新错位最小值
}
}
printf("%.6lf\n",dp[n%2][len]);//运行的结果就存在dp数组中的最后一位,也就是dp[n%2][len]
}
return 0;
}