优美子数组

探寻数组中能组成奇数数组多少个?

题目描述 小D同学经常与别人有一些不一样的见解,例如小D同学认为,如果一个数组中的数字全部都是奇数,那么小D认为这个数组是一个优美的数组。现在给定一个数组,你能告诉小D,从这个数组中可以截取多少个连续的子数组,是优美的数组么?

输入

多组测试数据,以EOF结束。
每组测试数据有两行,第一行一个整数n,表示数组的长度。接下来一行有n个整数,表示一个长度为n的数组的数组元素。
其中0<n<=50000,数组元素均大于等于0且在int范围内

输出

对于每组测试数据输出一行,每行一个数字,表示可以截取的优美数组的数量。

样例输入 Copy

5
1 2 3 4 5
5
1 3 4 5 7

样例输出 Copy

3
6

#include<stdio.h>
int main()
{
	int n,j,i,arr[100000],l,r;;
	while(scanf("%d",&n)!=EOF)
	{
		long long ans=0;//用longlong防止越界;
		l=0;
		for(i=0;i<n;i++)
		{
			scanf("%d", &arr[i]);
		}
		while(l<n)
		{
			while(l<n&&arr[l]%2==0)
			{
				l++;
			}//判断是不是偶数,如果是偶数,跳过;
			r=l;//再将此时的数组的下标赋给r,为最后求奇数数组长度作铺垫;
			while(r<n&&arr[r]%2!=0)
			{
				r++;
			}//得出奇数结束时的位置
			ans+=(r - l + 1) * (r - l) / 2;//此处用的公式;
			l=r;//将奇数过后第一个偶数赋给l继续循环;

	}
		printf("%lld\n", ans);
	}
	return 0;
}

##总结:用l和r两个变量求出此数组中每一段奇数数组的最长长度; 再将这段奇数数组拿出来看,每一段长奇数数组可以分成多个小奇数数组; 因为要求的是连续的子数组且数组元素都是奇数,那么就把数组中所有的元素为奇数、被偶数分隔的连 续子数组都找到,例如数组[1,3,5,4,5] ,那么取出[1,3,5] 和[4,5] ,然后在判断每一个连续子数组可 以取出多少个满足题意的数组。对于一个长度为n 的数组,可以取出n*(n+1)/2个连续子数组,例如有数组 [1,3,5],那么可以取出 [1] [3] [5] [3,5] [1,5][1,3,5]共 6个子数组。注意结果是 long long范围内;

注意公式:从长度为n的数组中能取多少子数组;

2的n次方-1(类似集合中取非空子集);

个人感慨:这种搜寻奇数组的题遇到很多次,这次总算弄懂了;先找所有连续的最长奇数组,然后在每个数组中搜寻可以弄成奇数组的子数组;
其实还是数学问题;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值