题解 | #牛牛的数组匹配#

牛牛的数组匹配

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;
            }
        }
    }
}

全部评论

相关推荐

酷酷的喜马拉雅山:感觉这比一直在初筛不动的好多了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务