链接:http://codeforces.com/problemset/problem/1141/C
题意:给一个n,再给出n-1个数,n-1个数为数组q,要求出数组p,满足qi=pi+1−pi. 并且p数组内的n个
数字包含1~n的每个数字,如果可以输出p数组,否则输出-1
因为给出了递推式和q数组,所以只要求出p数组的一个元素,就可以推出其他元素,将递推式化一下
可以得到pi+1=pi+qi;
所以p2=q1+p1;
p3=p2+q2=q1+q2+p1
p4=p3+q3=q1+q2+q3+p1
......
pn=pn-1+qn-1=q1+q2+...+qn-1+p1
所以p数组中的第i个元素即是q数组第i-1项的前缀和加上p1,再满足p中所有元素的和为1+2+...+n
所以 总和total-q数组累加的前缀和all 除以n即是p数组的第一项,通过递推式就可以得到答案;
用vis数组来统计1~n每个元素的输出情况,如果有没出现,则输出-1;
#include<iostream>
using namespace std;
int p[200010], q[200010], sum[200010], vis[200010];
int main(){
long long n;
long long all = 0;
cin >> n;
for (int i = 0; i < n - 1; i++)
{
cin >> q[i];
all += q[i];
sum[i] = all;
}
all = 0;
long long total = 0;
for (int i = 0; i < n; i++)
{
total += i + 1;
if (i != 0)
all += sum[i - 1];
}
p[0] = (total - all) / n; //算出首项
if (p[0] >= 1 && p[0] <= n)//不加会RE
vis[p[0]] = 1;
for (int i = 1; i < n; i++)
{
p[i] = p[i - 1] + q[i - 1];
if (p[i] >= 1 && p[i] <= n)
vis[p[i]] = 1;
}
for (int i = 1; i <= n; i++)
{
if (vis[i] != 1)
{
cout << "-1" << endl;
return 0;
}
}
for (int i = 0; i < n; i++)
cout << p[i] << " ";
return 0;
}