题解 | 牛牛的数组匹配

牛牛的数组匹配

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

全部评论

相关推荐

白火同学:大二有这水平很牛了,可以适当对关键信息加粗一点,比如关键技术、性能指标之类的。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 13:54
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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