求男生女生中配对的最小差值和,因为将身高排序号再配对一定不会有交叉,所以先将两组人的身高排序,再进行计算
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define maxn 10010
#define csize 110
#define INF 99999999
double nan[maxn],nv[maxn];
double dp[2][csize];
int n,m;
int cmp(const void*a,const void*b)
{
return *(double*)a>*(double*)b?1:-1;
}
double end;
double min(double a,double b)
{
return a<b?a:b;
}
void h(double a[],double b[],int na,int nb)
{
int i,j;
double tmp;
for(i=0;i<=nb-na;i++)
{
dp[0][i]=fabs(a[0]-b[i]);
}
for(i=1;i<na;i++)
{
tmp=INF;
for(j=0;j<=nb-na;j++) //j是na组第i个人与nb组人配对的偏差数
{
tmp=min(tmp,dp[(i-1)%2][j]); //tmp存的是第i-1个人偏差不超过j的最小差值和,tmp通过j的后移更新
dp[i%2][j]=tmp+fabs(a[i]-b[i+j]);
}
}
end=INF;
for(i=0;i<=nb-na;i++)
{
end=min(end,dp[(na-1)%2][i]);
}
}
int main()
{
int i,j;
while(scanf("%d %d",&n,&m)&&n+m!=0)
{
for(i=0;i<n;i++)
scanf("%lf",&nan[i]);
for(j=0;j<m;j++)
scanf("%lf",&nv[j]);
qsort(nan,n,sizeof(double),cmp);
qsort(nv,m,sizeof(double),cmp);
if(n<m)
h(nan,nv,n,m);
else
h(nv,nan,m,n);
printf("%.6f\n",end);
}
return 0;
}