C语言每日一题(17)数组匹配

编程入门 行业动态 更新时间:2024-10-24 12:31:32

C语言每日一题(17)<a href=https://www.elefans.com/category/jswz/34/1771288.html style=数组匹配"/>

C语言每日一题(17)数组匹配

牛客网 BC156 牛牛的数组匹配

题目描述

描述

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

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

输入描述:

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

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

输出描述:

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

思路分析

基于滑动窗口的思想,从数组最左边开始,将连续子数组之和与numa(a数组里的总和)进行比较。

步骤流程

1.定义所需要输入的数n和m,需要输入的数组a和b,输入a数组时记得求a数组的和(numa)

2.输入完成后,开始进行循环

3.这里需要考虑一个特殊情况,就是当m==1时,就无须进行比较了,直接将b【0】输出即可。

定义left和right分别指向数组最左边的最小连续数组的下标,left=0,right=1,为了之后的方便输出,我们再定义一个cl和cr记录left和right的值。

循环的条件是left<right的同时right<m。

每一次循环:求left和right之间值的和sum,并将sum与numa的差值与min(定义的最小差值,最开始等于numa)进行比较,如果小于min,就将该值赋给min,同时将left的值赋给cl,right的值赋给cr,之后再判断sum的值是否大于numa,大于则left++,小于则right++,(防止连续子数组越来越大)

循环结束后,输出cl和cr之间的值。

完整代码

#include <stdio.h>
#include<stdlib.h>
int main() {int a[50]={0};int b[50]={0};int n=0;int m=0;scanf("%d %d",&n,&m);int suma=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]);}int left=0;int right=1;int cl=0;int cr=0;int min=suma;//最小差值,最开始=numaif(m==1)//m=1的情况直接输出{printf("%d",b[0]);return 0;}while(left<right&&right<m){int sum=0;for(int i=left;i<=right;i++){sum+=b[i];}if(abs(sum-suma)<min)//abs函数用来求两者之间差的绝对值{min=abs(sum-suma);cl=left;cr=right;}if(sum>suma)//判断sum与numa的情况{left++;}if(sum<suma){right++;}}for(int i=cl;i<=cr;i++)//输出{printf("%d ",b[i]);}return 0;
}

更多推荐

C语言每日一题(17)数组匹配

本文发布于:2023-12-03 20:31:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1657332.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数组   语言

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!