题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3392

Pie

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 793    Accepted Submission(s): 214

Problem Description
A lot of boys and girls come to our company to pie friends. After we get their information, we need give each of them an advice for help. We know everyone’s height, and we believe that the less difference of a girl and a boy has,
the better it is. We need to find as more matches as possible, but the total difference of the matches must be minimum.
 
Input
The input consists of multiple test cases. The first line of each test case contains two integers, n, m (0 < n, m <= 10000), which are the number of boys and the number of girls. The next line contains n float numbers, indicating
the height of each boy. The last line of each test case contains m float numbers, indicating the height of each girl. You can assume that |n – m| <= 100 because we believe that there is no need to do with that if |n – m| > 100. All of the values of the height
are between 1.5 and 2.0.

The last case is followed by a single line containing two zeros, which means the end of the input.
 
Output
Output the minimum total difference of the height. Please take it with six fractional digits.
 
Sample Input
2 3
1.5 2.0
1.5 1.7 2.0
0 0
 
Sample Output
0.000000
 
Author
momodi@whu
 
Source
 

思路:dp+滚动数组

(1):要求最佳匹配。首先得将两数组从小到大排序~

(2): 然后再明白dp[][]表示的意思;dp[i][j] 表示a数组中前i个数和b数组中前j个数匹配的最优解

(3):接下来 看看状态转移方程; if(i==j)dp[i][j]=dp[i-1][j-1]+fabs(a[i]-b[j]);

else dp[i][j]=min(dp[i-1][j-1]+fabs(a[i]-b[i]),dp[i][j-1]);

(4):   由于题目中的n最大取到10000。假设开个数组dp[10000][10000],那么执行不了~那么再观察观察状态转移方程,发现当前这个数是由它左边这列递推过来的。我们能够用一个dp[2][10000]的滚动数组就可以,由于我仅仅关心最后一个dp[n][m]值,所曾经面的一些值被覆盖不影响我后面的求值过程;(能够在纸上画一画,就知道这个滚动数组了)

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
const int maxn=11000;
using namespace std; double a[maxn],b[maxn];
double dp[2][maxn]; int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)break;
for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
for(int i=1;i<=m;i++)scanf("%lf",&b[i]); double *A=a,*B=b;
if(n>m){swap(n,m);swap(A,B);}
sort(A+1,A+1+n);
sort(B+1,B+1+m);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=i;j<=i+m-n;j++)
{
if(i==j)
{
dp[i&1][j]=dp[(i-1)&1][j-1]+fabs(A[i]-B[j]);
//printf("dp[%d][%d] :%.6lf",i,j,dp[i&1][j]);
}
else
{
dp[i&1][j]=min(dp[(i-1)&1][j-1]+fabs(A[i]-B[j]),dp[i&1][j-1]);
//printf("dp[%d][%d] :%.6lf",i,j,dp[i&1][j]);
}
}
printf("%.6lf\n",dp[n&1][m]);
}
return 0;
}

最新文章

  1. 详解用Navicat工具将Excel中的数据导入Mysql中
  2. [第三方]SCNetworkReachability 获取网络状态控件使用方法
  3. 用存储过程 将大段的SQL藏起来
  4. css3 线性渐变和径向渐变
  5. hdu 饭卡
  6. 1172 Hankson 的趣味题
  7. oracle语句批处理
  8. bat脚本自定义魔兽warIII运行分辨率,去黑边
  9. Java集合详解2:LinkedList和Queue
  10. Socket与WebScoket
  11. [十二]JavaIO之BufferedInputStream BufferedOutputStream
  12. LeetCode算法题-Sum of Left Leaves(Java实现)
  13. JavaWeb 简单实现客户信息管理系统
  14. Android -- Handling back button press Inside Fragments
  15. 在 Ubuntu 14.04 Chrome中安装Flash Player(转)
  16. gradle仓库配置
  17. Android 获取全局Context的技巧
  18. (转)WebSocket的原理
  19. Hibernate_Validator学习
  20. [QSCOJ39]喵哈哈村的代码传说 第五章 找规律

热门文章

  1. Python面向对象之什么是类(1)
  2. docker端口的映射顺序
  3. tomcat源码分析一
  4. Mysql,phpmyadmin密码忘了怎么办
  5. 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra
  6. [SDOI2008][luogu2463] Sandy的卡片 [kmp]
  7. Windows系统——后缀为.zip.00X的zip分卷解压
  8. 零基础学习Mahout之-----搭建单机环境
  9. WebService 序列化和反序列化
  10. set与map的区别