题解 | #牛牛的数组匹配#
牛牛的数组匹配
http://www.nowcoder.com/practice/3d3406f4a7eb4346b025cc592be5b875
#include<math.h>
int main() {
int n, m, val;
scanf("%d %d", &n, &m);
int a[n], b[m], suma = 0, sumb = 0;
for (int i = 0; i < n; i++) { //依次输入a数组的元素
scanf("%d ", &a[i]);
suma += a[i]; //求a数组和
}
int val1 = suma, max1 = m, min1;
for (int i = 0; i < m; i++) { //依次输入b数组的元素
scanf("%d ", &b[i]);
sumb += b[i]; //求b数组和
}
if (suma < sumb) { //如果a数组和小于b数组和时
for (int i = 0; i < m; i++) { //从第一个数开始计算
sumb = 0;
for (int j = i; j < m; j++) { //从i个数开始往后求和
sumb += b[j];
if (j == i) //每次i值改变时重新赋值
val = fabs(suma - sumb);
//若当前b数组和值与a数组和的差小于上一次的差值时
if (fabs(suma - sumb) < val)
val = fabs(suma - sumb);
//若当前b数组和值与a数组和的差大于上一次的差值时结束循环
if (fabs(suma - sumb) > val) {
//若当前差值小于前几次计算的最小差值
if (val < val1) {
val1 = val;
min1 = i;
//因循环是在差值大于上一次的差值时结束的
//这里的j是在最大位置后一位,所以要减1
max1 = j - 1;
}
break;
}
}
}
}
//若b数组之和小于a数组之和,就可以直接输出所有值,无需判断
else {
min1 = 0;
max1 = m - 1;
}
//根据不同情况不同输出
//这块是因为上面个别案例判断暂时没找到解决方案,就从输出直接解决了
if (max1 != m) {
for (int i = min1; i <= max1; i++)
printf("%d ", b[i]);
} else {
for (int i = min1; i < max1; i++)
printf("%d ", b[i]);
}
return 0;
}