题解 | 牛牛的数组匹配
牛牛的数组匹配
https://www.nowcoder.com/practice/3d3406f4a7eb4346b025cc592be5b875
#include <stdio.h> int get_distance(int b[], int i, int m, int *temp, int suma) { int sumb = 0; int j = 0; int distance = 0; for (j=i; j<m; ++j) { sumb += b[j]; if (sumb > suma) { break; } } if (j == m) { distance = suma - sumb; *temp = j - 1; } else { if (m - i > 1) { int d1 = suma - (sumb-b[j]); int d2 = sumb - suma; if (d2 < d1) { distance = d2; *temp = j; } else { distance = d1; *temp = j - 1; } } else//只有一个元素 { distance = sumb - suma; *temp = j; } } return distance; } int main() { int n = 0; //数组a的长度 int m = 0; //数组b的长度 scanf("%d %d", &n, &m); int a[n]; int b[m]; int suma = 0; //a数组元素之和 int left = 0; //目标子数组左下标 int right = 0; //目标子数组右下标 int k = 0; // 暂存子数组元素之和 int distance = 32767; //子数组元素之和与suma的距离 int temp = 0; //暂存目标子数组右下标 for (int i=0; i<n; ++i) { scanf("%d", &a[i]); suma += a[i]; } for (int i=0; i<m; ++i) { scanf("%d", &b[i]); } for (int i=0; i<m; ++i) { k = get_distance(b, i, m, &temp, suma); if (k == 0) { left = i; right = temp; break; } if (distance > k) { distance = k; left = i; right = temp; } } for (int i = left; i<= right; ++i) { printf("%d ", b[i]); } return 0; }