悟的数组匹配

题目:

描述

牛牛刚学会数组不久,他拿到两个数组 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 函数分别读入变量 n 和 m,分别表示数组 a 和 b 的长度。然后定义了两个数组 a 和 b,并使用循环分别读入数组元素。

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

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

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

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

答案:

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;
}
相关推荐
GJGCY8 分钟前
金融AI Agent厂商怎么选?系统集成、API/RPA、权限审计与异常恢复能力评估
人工智能·经验分享·ai·金融·智能体
moshuying30 分钟前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
没落之王43 分钟前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
m4Rk_1 小时前
【论文阅读】Agent 记忆机制(113):Agentic Memory Management——从“检索相关信息”走向“管理 Agent 内部记忆”
论文阅读·人工智能·学习·开源·github
INGNIGHT1 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying1 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
小超人诞生日记2 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
多弗朗皮卡丘2 小时前
C++的IO流
开发语言·c++·io流·文件io流
辣知2 小时前
辣知·化智92 《山海经》里的史前密码
学习
鬼手点金2 小时前
KV Cache 未必是一次性的:可编辑、可组合的“笔记”
java·人工智能·笔记·学习·自动化·1024程序员节