CodeForces 1141C

https://vjudge.net/problem/CodeForces-1141C

 

 

#include 
using 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 特别是这一块儿 

 

你可能感兴趣的:(CodeForces 1141C)