悟的数组匹配

题目:

描述

牛牛刚学会数组不久,他拿到两个数组 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;
}
相关推荐
StandbyTime几秒前
C语言学习-菜鸟教程C经典100例-练习40
c语言
tkevinjd1 分钟前
力扣hot100-283移动零(盲人拉屎)
算法·leetcode
o(╥﹏╥)3 分钟前
Learn how Gen AI 学习笔记
人工智能·笔记·学习
POLITE35 分钟前
Leetcode 94. 二叉树的中序遍历 104. 二叉树的最大深度 226. 翻转二叉树 101. 对称二叉树 (Day 13)
算法·leetcode·职场和发展
老鼠只爱大米8 分钟前
LeetCode经典算法面试题 #2:两数相加(迭代法、字符串修改法等多种实现方案详解)
算法·leetcode·链表·两数相加·字符串修改法·两数相减·大数运算
edisao12 分钟前
【开源】轻量级 LLM 文本质检工具:精准识别核心概念缺失,支持动态别名 + 反馈闭环
大数据·开发语言·人工智能·经验分享·gpt·架构·开源
进阶小白猿12 分钟前
Java技术八股学习Day23
java·网络·学习
臭东西的学习笔记19 分钟前
论文学习——酶动力学参数预测的机器学习模型研究进展
人工智能·学习·机器学习
季明洵21 分钟前
二分搜索、移除元素、有序数组的平方、长度最小的子数组
java·数据结构·算法·leetcode
XH华22 分钟前
备战蓝桥杯,第一章:C++入门
c++·蓝桥杯