悟的数组匹配

题目:

描述

牛牛刚学会数组不久,他拿到两个数组 a 和 b,询问 b 的哪一段连续子数组之和与数组 a 之和最接近。

如果有多个子数组之和同样接近,输出起始点最靠左的数组。

输入描述:

第一行输入两个正整数 n 和 m ,表示数组 a 和 b 的长度。

第二第三行输入 n 个和 m 个正整数,表示数组中 a 和 b 的值。

输出描述:

输出子数组之和最接近 a 的子数组

示例1

输入:

复制代码
2 6
30 39 
15 29 42 1 44 1

输出:

复制代码
29 42

示例2

输入:

复制代码
6 1
50 47 24 19 46 47 
2

输出:

复制代码
2

思路讲解:

这段代码的功能是从两个数组中选择一段连续的子数组,使得两个子数组的和之差最小,并输出该子数组。

首先,在主函数中,使用 scanf 函数分别读入变量 nm,分别表示数组 ab 的长度。然后定义了两个数组 ab,并使用循环分别读入数组元素。

接下来,代码使用循环计算数组 a 的元素之和,并将其保存在变量 sum1 中。然后初始化变量 minsum1,表示初始的两个子数组的和之差。

接下来进入嵌套的循环,外层循环控制数组 b 的起始位置,内层循环控制数组 b 的结束位置。在内层循环中,计算当前子数组的和 sum2,并使用函数 num 计算 sum1sum2 的差的绝对值。如果得到的差值小于当前最小值 min,则更新 min 和相应的起始位置 k 和结束位置 l

最后,通过循环遍历输出数组 b 中起始位置 k 到结束位置 l 的元素。

请注意,代码中使用了函数 num 来计算两个数字的差的绝对值。函数 num 的实现非常简单,它接受两个参数 ab,并返回它们之间的差的绝对值。

答案:

cpp 复制代码
#include <stdio.h>

// 计算两个数的绝对值差
int num(int a, int b) {
    if (a >= b)
        return a - b;
    else
        return b - a;
}

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    int a[100] = {0};
    int b[100] = {0};
    int sum1 = 0, sum2 = 0, min, k, l;

    // 读取数组 a 的元素
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    // 读取数组 b 的元素
    for (int i = 0; i < m; i++) {
        scanf("%d", &b[i]);
    }

    // 计算数组 a 的元素之和
    for (int i = 0; i < n; i++) {
        sum1 += a[i];
    }
    min = sum1;

    // 寻找两个子数组的和之差的绝对值最小值
    for (int i = 0; i < m; i++) {
        sum2 = b[i];
        for (int j = i + 1; j <= m; j++) {
            if (num(sum1, sum2) < min) {
                min = num(sum1, sum2);
                k = i;
                l = j;
            }
            sum2 += b[j];
        }
    }

    // 输出和之差最小的子数组
    for (int i = k; i < l; i++) {
        printf("%d ", b[i]);
    }

    return 0;
}
相关推荐
2301_8227032041 分钟前
Flutter 框架跨平台鸿蒙开发 - 创意声音合成器应用
算法·flutter·华为·harmonyos·鸿蒙
cmpxr_1 小时前
【C】数组名、函数名的特殊
c语言·算法
KAU的云实验台1 小时前
【算法精解】AIR期刊算法IAGWO:引入速度概念与逆多元二次权重,可应对高维/工程问题(附Matlab源码)
开发语言·算法·matlab
会编程的土豆1 小时前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
低频电磁之道1 小时前
解决 Windows C++ DLL 导出类不可见的编译错误
c++·windows
W.W.H.2 小时前
常见面试题——中断是如何产生的
经验分享·nvic·嵌套向量中断控制器
aWty_2 小时前
实分析入门(1)--皮亚诺和自然数
学习
恒拓高科WorkPlus2 小时前
简单聊天、传文件,为何推荐BeeWorks私有化IM? - BeeWorks
经验分享
weixin_513449962 小时前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习