Crack Codes CodeForces - 950B

Problem - 950B - Codeforces

题目大意:有一个长度为n的a数组,一个长度为m的b数组,其中b数组中的每一个数都是由a数组中的一些连续的数通过加和得到的,并且严格按照从左到右的顺序对应

1<=n,m<=1e5;1<=a[i],b[i]<=1e6;

思路:因为数组很短,所以可以暴力解决,我们分别记录两个数组一些数的和,分别用一个指针来维护,先右移a数组的指针,如果suma>sumb,就把b数组的指针右移,直到suma==sumb,答案计数+1,并且重置suma,sumb

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
int a[N], b[N];
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
	}
	for (int i = 1; i <= m; i++)
	{
		scanf("%d", &b[i]);
	}
	ll suma = 0, sumb = 0;//注意1e5*1e6可能会爆int
	int ra = 0, rb = 0, ans = 0;
	while (ra <= n && rb <= m)
	{
		suma += a[++ra];//右移a数组指针,同时suma+
		if (ra > n)//a数组都遍历过了就结束
			break;
		while (suma > sumb)
		{
			sumb += b[++rb];
		}//suma>sumb了,就右移b数组指针
		if (suma == sumb)
		{
			ans++;
			suma = sumb = 0;
		}
	}
	cout << ans;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timidcatt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值