题目地址:http://codeforces.com/problemset/problem/1141/C
思维题,用到了线性代数中的线性方程组求解的方法,求出一个通式出来,然后在判断这个通式的某一个解是否在1到n之间,这里可以先另p[0]=0,再求出p[1],p[2],.....p[n],再找出最小的t=min(t,p[i]),最后把所有的p[i]=p[i]-t+1,即能求出一组解,然后进行判断。
/*
http://codeforces.com/problemset/problem/1141/C
*/
#include<iostream>
using namespace std;
int q[200005];
int p[200005];
int f[200005];
int main()
{
int n;
cin>>n;
int i;
p[0]=0;
int mi=p[0];
for(i=0;i<n-1;++i)
{
cin>>q[i];
p[i+1]=p[i]+q[i];
mi=min(mi,p[i+1]);
}
mi=1-mi;
int F=0;
for(i=0;i<n;++i)
{
p[i]=p[i]+mi;
if(p[i]<=0||p[i]>n)
{
F=1;
break;
}
else if(f[p[i]])
{
F=1;
break;
}
f[p[i]]=1;
}
if(F) cout<<"-1\n";
else
{
for(i=0;i<n;++i) cout<<p[i]<<' ';
}
return 0;
}