题目链接:http://codeforces.com/contest/1141/problem/C
题意:现在有一个数列A,里面包含n个数,1到n,但是是无序排列的,现在给你一个数列B,数列B由A得到,bi = a[i+1] - a[i],现在你需要还原出数列A,如果数列A不存在输出-1。
解题心得:
- 比赛的时候卡这个题卡的要死要死的,感觉脑子这个题想清楚了,就是差一点写不出来,尴尬啊,难受啊。
- 具体做法就直接假设第一个数是1,然后得到一个数列A’,这个时候检查A’里面的不同的数是否刚好n个,并且A’中最大的数减去最小的数必须是n-1,不符合直接输出-1。
- 检查最大的数是否超过n,如果超过n,算得最大的数和n的差值c,然后将A’中所有的数减去c就行了;否则检查最小的数是否小于1,如果小于1,算得最小的数和1的差值c,然后将A’中所有的数加上c就行了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 100;
int num[maxn], n;//记录差值
void init() {
scanf("%d", &n);
for (int i = 1; i < n; i++)
scanf("%d", &num[i]);
}
void solve() {
int Min = 1, Max = 1, now = 1;
set<int> se;//检查是否刚好n个不同的数
se.insert(1);
for (int i = 1; i < n; i++) {
now = now + num[i];
se.insert(now);
Max = max(Max, now);
Min = min(Min, now);
}
if (se.size() != n || Max - Min + 1 != n) {//得不到原始数列
puts("-1");
return;
}
//将整个数列向上或者向下平移
int cha = 0;
if (Min <= 0)
cha = 1 - Min;
if (Max > n)
cha = n - Max;
now = 1 + cha;
printf("%d ", now);
for (int i = 1; i < n; i++) {
now = now + num[i];
printf("%d ", now);
}
}
int main() {
// freopen("1.in", "r", stdin);
init();
solve();
return 0;
}