题解 | #牛牛的数组匹配#

牛牛的数组匹配

https://www.nowcoder.com/practice/3d3406f4a7eb4346b025cc592be5b875

#include <iostream>
using namespace std;

int main() {
    int n, m, sum = 0, start = 0, end = 0, sumup = 0;
    cin >> n >> m;
    int a, b[m];
    for (int i = 0; i < n; i++) {				//计算第一个数列的和
        cin >> a;
        sum += a;
    }
    for (int i = 0; i < m; i++) cin >> b[i];		//录入第二个数列
    if (m == 1) cout << b[0];
    int left = 0, right = 0, sub = sum;				//left,慢指针,right,快指针,sub此时第二个数列连续
  													//元素之和与第一个数列和之差的绝对值
    while (right < m) {
        sumup += b[right];							//从左往右,依次累加
        if (sub > abs(sum - sumup)) {				//由于题目要求是连续顺序而且第二个数列中元素均为正数,因此当sumup大于sum时,将right序号的元素删除,可以使sumup接近sum,但是接近的效果需要进行评估
            sub = abs(sum - sumup);					//当接近效果好时,记录当前的sub,left和right指针的位置。加减元素时,均要进行接近效果的判断。
            start = left;
            end = right;
        }
        if (sumup > sum) {
            sumup -= b[left];
            left++;
        }
        if (sub > abs(sum - sumup)) {
            sub = abs(sum - sumup);
            start = left;
            end = right;
        }
        right++;
    }
    for (int i = start; i <= end; i++) cout << b[i] << ' ';//打印元素
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

头像
10-15 22:27
已编辑
门头沟学院 C++
罗格镇的小镇做题家:我投了hr打电话来说学历太低了不符合要求,建议投荣耀,结果荣耀也投了一定水花没有,非本211硕
投递华为等公司10个岗位
点赞 评论 收藏
分享
10-18 13:01
已编辑
西安理工大学 C++
小米内推大使:建议技能还是放上面吧,hr和技术面试官第一眼想看的应该是技能点和他们岗位是否匹配
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务