这个题好坑。。。如果给你一个很大的数(42样例中为10738),再加上199992个数,就会让mx达到21亿,让int溢出,RE的结果。所以在循环的过程中,就要判断最大值是否比最小值大N,如果已经大N了,则没有解,直接退出。
本题不成立的两个条件
1.最大值比最小值大N及N以上
2.有两个重复数字
#include<bits/stdc++.h>
using namespace std;
int a[800000+5];
bool num[800000+5]={false};
int main(void){
int n;
cin>>n;
a[0]=1;
int mn=1,mx=1;
bool cuo=0;
for(int i=1;i<n;i++){
int cha;
cin>>cha;
a[i]=a[i-1]+cha;
mn=min(mn,a[i]);
mx=max(mx,a[i]);
if(mx-mn+1>n){
cuo=true;
break;
}
}
int jia=1-mn;
if(mx-mn+1>n){
cuo=true;
}
else{
for(int i=0;i<n;i++){
if(num[a[i]+jia]||a[i]+jia>n){
cuo=true;
break;
}
else{
num[a[i]+jia]=true;
}
}
}
if(cuo){
printf("-1");
return 0;
}
for(int i=0;i<n;i++){
printf(i==0?"%d":" %d",a[i]+jia);
}
return 0;
}