您的位置:首页 > 产品设计 > UI/UE

[FZYZOJ 1017] liqeuer

2015-06-24 22:40 651 查看

P1017 -- liqeuer

时间限制:1000MS

内存限制:65536KB

Description

轰的一声,展现在你眼前的是两堆零件和一条岩浆"河",我们将第一堆零件定义为集合S1,第二堆定义为集合S2。

首先,S1的零件个数少于等于S2的零件个数。我们现在设N为S1的零件个数,从S2中挑选出N个零件,使得两个集合的匹配差最小。这样搭建出来的桥才能顺利通过岩浆"河"。

对于两个集合的匹配差在本题定义作此描述: 定义F(S1,S2)=min(|a1-b1|+|a2-b2|+|a3-b3|+...+|an-bn|){n为S1的元素个数,ai∈S1,bi∈S2},F(S1,S2)即为两个集合的匹配差。

Input Format

第一行一个数testcase,表示测试数据组数(0<=testcase<=5)

每组数据的格式如下:第一行两个数n1,n2(0<=n1<=n2<=500),n1表示第一堆零件的个数,n2表示第二堆零件的个数。

接下来n1行,每行一个数,表示S1的各个元素(不超过10000)。再接下来n2行,每行一个数,表示S2的各个元素(同样不超过10000)。

Output Format

输出testcase行,每行一个数。第i行表示第i组数据的两个集合的匹配差值的最小值。

Sample Input

3
10 10
1
2
3
4
5
6
7
8
9
20
10
11
12
13
14
15
16
17
18
19
4 5
1
2
3
4
5
6
7
8
9
8 12
3
4
6
8
10
16
21
25
29
34
25
12
42
35
62
19
31
49
46
37

Sample Output

82
16
129

Hint

【题解】序列动态规划

f[i][j]表示S1匹配到i,S2匹配到j的最小F值

f[i][j]= (i==j) ? (f[i-1][j-1]+abs(a[i]-b[j])) : (min(f[i][j-1], f[i-1][j-1]+abs(a[i]-b[j])))

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int n1,n2,f[510][510];
int a[510],b[510];
int abs(int x) {return x>0?x:-x;}
int main() {
int test; scanf("%d",&test);
while(test--) {
n1=n2=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(f,0,sizeof(f));
scanf("%d%d",&n1,&n2);
for (int i=1;i<=n1;++i) scanf("%d",&a[i]);
for (int i=1;i<=n2;++i) scanf("%d",&b[i]);
sort(a+1,a+n1+1); sort(b+1,b+n2+1);
for (int i=1;i<=n1;++i)
for (int j=i;j<=n2-n1+i;++j)
if(i==j) f[i][j]=f[i-1][j-1]+abs(a[i]-b[j]);
else f[i][j]=min(f[i][j-1],f[i-1][j-1]+abs(a[i]-b[j]));
printf("%d\n",f[n1][n2]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: