21天挑战的最后一篇。
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
…
欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程。您可以从以下3个方面任选其一着手(不强制),或者按照自己的理解发布专栏学习作品,参考如下:
不知不觉连续更了21天,(为书包而奋斗),和大家一起学习了21天,虽然有时候太忙就水文章,但是还是学到了很多,认识了很多小伙伴,真的很开心~
今天咱一起学习一下牛牛的数组匹配哈。
题目:
牛牛刚学会数组不久,他拿到两个数组 a 和 b,询问 b 的哪一段连续子数组之和与数组 a 之和最接近。
如果有多个子数组之和同样接近,输出起始点最靠左的数组。
第一行输入两个正整数 n 和 m ,表示数组 a 和 b 的长度。
第二第三行输入 n 个和 m 个正整数,表示数组中 a 和 b 的值。
输出子数组之和最接近 a 的子数组
- #include<stdio.h>
- /*思路:从完整数组开始,不断去掉前面的一个元素,用剩下的子数组进行下轮比较;
- *每轮判断规则(如果满足减去数组2当前的最后一个元素后,如果和数组1差值变小了,
- *就继续减去尾元素,直到满足差值最小,得到本轮最优解; 用该值和下一轮进行比较,
- *如果下一轮差值更小,则继续切割数组,找更下一轮,直到不满足,然后根据i,j位置输出数组元素;
- */
-
- #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;
- for(int i=0;i<n;i++)
- {
- scanf("%d",&a[i]);
- }
- for(int i=0;i<m;i++)
- {
- scanf("%d",&b[i]);
- }
- 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;
- }
以上就是今天要讲的内容,本文只是简单介绍了一种解题方法,希望对大家有帮助~