题解 | #牛牛的数组匹配#
牛牛的数组匹配
https://www.nowcoder.com/practice/3d3406f4a7eb4346b025cc592be5b875
#include <stdio.h>
void find_min(int arr[],int n,int num,int* x,int* m);
int abs_num(int x,int y);
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int arr1[n];
int arr2[m];
int i=0;
//输入,并求数组1中的和
int sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr1[i]);
sum+=arr1[i];
}
for(i=0;i<m;i++)
{
scanf("%d",&arr2[i]);
}
//遍历2数组
int x=0; //从第几个开始
int num=0; //到第几个数
find_min(arr2,m,sum,&x,&num);
//打印
for(i=x;i<=num;i++)
{
printf("%d ",arr2[i]);
}
return 0;
}
int abs_num(int x,int y)
{
return (x>y?(x-y):(y-x));
}
void find_min(int arr[],int n,int num,int* x,int* m)
{
int min=num; //最接近num的数
int i=0;
int j=0;
int sum; //arr2个元素和
//如果arr数组只有一个数
//不进入for循环。x,m的值也不会改变,均为0,不影响我们的结果
for(i=0;i<n;i++)
{
sum=0;
for(j=i;j<n;j++)
{
sum+=arr[j];
if(abs_num(sum,num) <min)
{
*x=i;
*m=j;
min=abs_num(sum,num);
}
//遍历更块,也可不加:
if(j<n-1 && abs_num(sum,num) <abs_num(sum+arr[j+1],num))
{
break;
}
}
}
}