题目:Photoshoot
题目链接:https://codeforces.ml/group/5yyKg9gx7m/contest/270203/problem/H
题目描述:
有一个由1——n乱序的数列,给出其a(i)+a(i+1)和。
求其最小字典序解。
题目分析:
设a1为未知数,可求通解,然后确定a1的值,是否可以还原。
ps:当项数为奇数个时可由和直接得到答案。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int a[1010];
bool b[1010];
int main()
{
int i,n,k,s,m,j,p,sum;
scanf("%d",&n);
for(i=2,s=0;i<=n;i++)
{
scanf("%d",&m);
a[i]=m-a[i-1]; //求a1为0时特解
s+=a[i];
}
if(n%2)k=n*(n+1)/2-s; //奇数情况
else {
for(i=1;i<=n;i++) //暴力测试偶数情况
{memset(b,0,sizeof(b));
for(j=1,m=i,sum=0;j<=n;j++)
{ p=a[j]+m;
if(0<p&&p<=n&&b[p]==0) {sum++;b[p]=1;}
m=-m;
}
if(sum==n) {k=i;break;}
}
}
printf("%d",k);
for(i=2;i<=n;i++) //得a1输出最优解
{
k=-k;
printf(" %d",a[i]+k);
}
return 0;
}