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);

}