探寻数组中能组成奇数数组多少个?
题目描述 小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(类似集合中取非空子集);
个人感慨:这种搜寻奇数组的题遇到很多次,这次总算弄懂了;先找所有连续的最长奇数组,然后在每个数组中搜寻可以弄成奇数组的子数组;
其实还是数学问题;