题干:
 

小w与tokitsukaze一起玩3ds上的小游戏,现在他们遇到了难关。

他们得到了一个数列,通关要求为这个数列的和为0,并且只有一次改变一个数的符号的机会(正数变成负数,负数变成正数)。

请问小w与tokitsukaze能否通关,如果能,请输出有多少个数符合要求,如果不能,请输出-1。

输入描述:

第一行包括一个正整数n(1≤n≤10^5),表示这个数列有n个数。
接下来一行有n个数x (-100≤x≤100),表示数列(数列的和保证不等于0)。

输出描述:

输出有多少个符合要求的数,如果没有,请输出-1。

示例1

输入

复制

5
1 3 -5 3 4

输出

复制

2

说明

只要把一个3变成-3,数列的和就变为0。数列里总共有两个3,所以有2个符合要求的数。

示例2

输入

复制

4
1 2 4 8

输出

复制

-1

解题报告:

  其实这题不需要前缀和,只需要记录数组的和然后遍历就行了、、因为这里没用到所有数的签注和这么多信息。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int a[MAX];
int sum[MAX];
int main()
{
	int n;
	cin>>n;
	for(int i = 1; i<=n; i++) scanf("%d",a+i),sum[i] = sum[i-1]+a[i];
	int ans = 0;
	for(int i = 1; i<=n; i++) {
		if(sum[i-1] + (sum[n]-sum[i])+(-a[i]) == 0) ans++;
	}
	if(ans == 0) ans--;
	printf("%d\n",ans);
	return 0 ;
 }