https://vjudge.net/problem/CodeForces-1141C
#includeusing namespace std; const int N=200005; int a[200005]; //输入的数组 int b[N]; //标记是否重复 int p[N]; //n的全排列 int main() { int n; scanf("%d",&n); for(int i=1; i ) scanf("%d",&a[i]),p[i]=p[i-1]+a[i]; //a[i]=p[i]-p[i-1] p[0]=0 然后一次相加,讲p[i]输入进去 int mi=p[0]; for(int i=1; i ) mi=min(mi,p[i]); for(int i=0; i ) { if(p[i]-mi+1>n||b[p[i]-mi+1]) { //p[i]-mi+1>n判断最大减去最小是否大于n,因为从0开始,要加1 printf("-1\n"); // b[p[i]-mi+1 判断是否重复 return 0; } b[p[i]-mi+1]=1; //标记 是否重复 } for(int i=0; i ) printf("%d ",p[i]-mi+1); return 0; } /*题意:给数字n,表示数组大小,然后是n-1个数字,表示后一位减去前一位的值 求回复原数组的值(原数组内1——n各出现一次)不能输出-1。*/ //这个题应用了一个定理或者式子吧?总感觉高中讲过, p[i]-mi+1>n 特别是这一块儿