老师面的小测试

Alic 的奇妙数组

1.题目描述

Alice 喜欢使用数组。今天,他需要您的帮助来完成一项艰巨的任务。
如果可以通过从开头删除几个(可能为零或全部)元素并从结尾删除几个(可能为零或全部)元素而从 b 获得 c ,则数组 c 是数组 b 的子数组。
如果对于该数组的每个非空子数组 ,该子数组的元素之和为非零,则将其称为好数组。
例如,数组[1 2 3] 是好的,因为所有 子 数组[-1] ,[-1,2] [-1,2 ,-3], [2],[ 2,-3 ],[-3] 具有非零元素和。但是,数组 [-1,2,-1,-3] 不好,因为他的子数组 [-1,2,-1] 的元素总和等于 0 。
现在Alice有一个数组a,她想知道a的所有非空良好子数组的数量。但是Alice最近忙于实验,所以只好请你帮助她计算。

2.格式设置

输入:
输入的第一行包含一个整数n 1≤n≤2×10^5 数组 a 的长度。
输入的第二行包含n 个整数 a1,a2,…,an (-109≤ai≤109) -a 的元素。
输出:
输出单个整数a 的良好子数组的数量。

3.数据测试

Sample Input: 1:
3
1 2 3
Sample Output 1:
5
Sample Input: 2
3
41 41 41
Sample Output 2
3

样例解释:
在第一个示例中,以下子数组是好的::[ 1],[ 1,2],[ 2],[2,-3], [-3] 。但是,子数组 [1,2 3] 不好,因为它的子数组 [1,2 ,-3] 的元素总和等于 0 。
在第二个样本中,大小为1 的三个子 数组 是唯一好的子 数组 。同时,子数组 [41,-41,41]不好,因为其子数组 [41,-41] 的元素总和等于 0 。

4.代码

#include<iostream>
using namespace std; 
int num[200005]; 
int main()
{
    
    
	int n;
	cin >> n;
	for(int i=0; i<n; i++)
		cin >> num[i];
	int counts = 0;
	for(int i=0; i<n; i++)
	{
    
    
		int tempcount = 0;
		for(int j=i; j<n; j++)
		{
    
    
			tempcount += num[j];
			if(tempcount!=0)
				counts++;
			else
				break;	
		}
	}
	cout << counts << endl;
	return 0;
}

5.思路

用暴力循环从前往后顺序来遍历每个子串。遇到良好的子串就++;遇到一个不好的子串,就结束当前循环以遍历过的数为前缀的子串。最后输出良好的子串的个数即可。

猜你喜欢

转载自blog.csdn.net/pfl_327/article/details/106212116
今日推荐