d563
輸入說明 : 每個測資檔只有一組測資,共兩行。 第一行整數n(1<=n<=100000)代表數列有幾個數字 第二行有n個正整數(A1,A2,...,An),並且全部總合小於2147483647,以空格隔開
--
範例測資3,6,2,1,4,5,2有三組等值首尾和,分別是:
11 = 3+6+2 = 2+5+4
12 = 3+6+2+1 = 2+5+4+1
23 = 3+6+2+1+4+5+2 = 2+5+4+1+2+6+3 (全部陣列的和,也代表答案至少有一組)
輸出說明 :
等值首尾和的數目
先算所有prefix和的值,存在s[]陣列
再來算Suffix和的值,因為所有元素都大於零
所以s[]陣列是遞增的,所以某個Suffix和的值比s[某個位置]大
那直接比s[某個位置+1]下一個就可以了
一旦s[]找完了,那就不用在做了因為Suffix和的值只會增加,但是你s[]最大的值都比我還小
所以就可以break;
#include<stdio.h>
int main()
{
int a[100000];
int s[100000];
int i;
int n;
scanf("%d",&n);
int sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
s[i]=sum;
}
int count=0;
sum=0;
int w=0;
for(i=0;i<n;i++)
{
if(w==n)
break;
sum+=a[n-1-i];
while(sum>s[w]&&w<n)
w++;
if(sum==s[w])
count++;
}
printf("%d",count);
}