题目大意:
定义一个数组,满足d1=a1, di=|ai−a(i-1)| ,2≤i≤n.
t (1≤t≤100)组测试,每一组输入一个n,1≤n≤100代表数组长度,下面给定0≤di≤100,问是否能还原出唯一的a(要求每个元素>=0)数组并输出来,不能还原输出-1.
思路:
a1一定是唯一的,后面(1)ai=di+a(i−1)或(2)ai=a(i−1)-di ,其中(1)一定是非负(合法),如果(2)小于零,则ai存在唯一解,继续递推。否则只需要判断(1)和(2)是否相同,即di是否等于0。如果是说明ai也可以构造出唯一的。否则可以构造出两个合法的ai1和ai2,那么下一步对a(i+1)递推的是否根据(1)式一定也可以推导出两个a(i+1)成立,以此类推整个序列就有多个解了。
CODE:
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N],d[N];
int main()
{
int _;
cin>>_;
while(_--){
int n,f=1;
cin>>n;
for(int i=1;i<=n;++i) cin>>d[i];
a[1]=d[1];
for(int i=2;i<=n;++i)
if(a[i-1]-d[i]<0) a[i]=d[i]+a[i-1];
else if(d[i]==0) a[i]=a[i-1];
else{
f=0;
break;
}
if(f) for(int i=1;i<=n;++i) cout<<a[i]<<" ";
else cout<<-1;
cout<<endl;
}
return 0;
}