C. Polycarp Restores Permutation(思维)Codeforces Round #547 (Div. 3)

原题链接:https://codeforces.com/contest/1141/problem/C

题意:给你一个长度为n-1的p序列,其中p[i]=a[i+1]-a[i];求原排列a,要求a序列中[1,n]每个数字都只出现一次,若有,则输出此序列,若没有,则输出-1

解题思路:我们由这a[i+1]=a[i]+p[i],是可以推导出我们的原排列a的,可a的首元素我们并不知道,那么我们能随便取吗?显然不能,为了让他们都能在1~n中,我们要计算p序列中序列最小值,再用1-minn即可得到首元素的值,这样的做法是为了不会因为首元素而影响原排列。得到原排列后,再对它进行判断,有没有越界,有没有只出现一次。这些都很好办。

AC代码:

/*
*邮箱:2825841950@qq.com
*blog:https://blog.csdn.net/hzf0701
*注:代码如有问题请私信我或在评论区留言,谢谢支持。
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<cstring>
#include<map>
#include<iterator>
#include<list>
#include<set>
#include<functional>
#include<memory.h>//低版本G++编译器不支持,若使用这种G++编译器此段应注释掉
#include<iomanip>
#include<vector>
#include<cstring>
#define scd(n) scanf("%d",&n)
#define scf(n) scanf("%f",&n)
#define scc(n) scanf("%c",&n)
#define scs(n) scanf("%s",n)
#define prd(n) printf("%d",n)
#define prf(n) printf("%f",n)
#define prc(n) printf("%c",n)
#define prs(n) printf("%s",n)
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;
const ll inf = 0x3f3f3f3f;//无穷大
const ll maxn = 2e5+2;//最大值。
//*******************************分割线,以上为代码自定义代码模板***************************************//

int p[maxn];
int q[maxn];
int n;
int main(){
	//freopen("in.txt", "r", stdin);//提交的时候要注释掉
	ios::sync_with_stdio(false);//打消iostream中输入输出缓存,节省时间。
	cin.tie(0); cout.tie(0);//可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
	while(cin>>n){
		int sum=0,minn=0;
		rep(i,0,n-2){
			cin>>q[i];
			sum+=q[i];
			if(sum<minn){
				minn=sum;
			}
		}
		p[0]=1-minn;
		rep(i,1,n-1){
			p[i]=q[i-1]+p[i-1];
		}
		bool flag=true;
		rep(i,0,n-1){
			if(p[i]<1||p[i]>n){
				//判断是否越界。
				flag=false;
				break;
			}
		}
		if(flag){
			set<int> s(p,p+n); //放到set容器中去重。
			int temp=s.size();
			if(temp!=n)flag=false;
		}
		if(flag){
			rep(i,0,n-1){
				cout<<p[i]<<" ";
			}
		}
		else
			cout<<"-1";
		cout<<endl;
	}
	return 0;
}

posted @   unique_pursuit  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示