题干:
小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 ;
}