题目链接
题目意思是让输入N个男的身高M个女的身高
让min(N,M)那一方全部配对完,求最小的差值总和
注意题目条件 |n – m| <= 100
题目意思是让输入N个男的身高M个女的身高
让min(N,M)那一方全部配对完,求最小的差值总和
注意题目条件 |n – m| <= 100
所以每个只要从i+1找到i+n-m就可以了
#include "stdio.h"
#include "string.h"
#include "algorithm"
using namespace std;
int n,m;
double b[10005],g[10005];
double dp[2][120]; //一维滚动数组 |n-m|小于等于100 所以二维超过100即可
double fabs( double x )
{
return x>=0?x:-x;
}
double min( double a,double b )
{
return a<=b?a:b;
}
void DP( int n,int m,double *a,double *b )
{
sort( a+1,a+n+1 ); //排序
sort( b+1,b+m+1 );
memset(dp,0,sizeof(dp));
int len = m-n+1; //长度差
for( int i=1; i<=n; i++ ) //男生
{
dp[i%2][1] = dp[(i-1)%2][1] + fabs( a[i] - b[i]); //默认先选第i个元素
for( int j=2; j<=len; j++ )//匹配女生 匹配长度差超过len 后面的将不够匹配
{
dp[i%2][j] = min( dp[(i-1)%2][j]+fabs( a[i] - b[i+j-1]) , dp[i%2][j-1] );
}
}
printf("%.6lf\n",dp[n%2][len]);
}
int main()
{
int i;
while( scanf("%d%d",&n,&m)==2,(n||m) )
{
for( i=1; i<=n; i++ )
scanf("%lf",&b[i]);
for( i=1; i<=m; i++ )
scanf("%lf",&g[i]);
if( n<=m ) //用短的匹配长的
DP( n,m,b,g );
else
DP( m,n,g,b );
}
return 0;
}