CS 300
题意:给出长度为n-1的序列a,要求构造出一个n位数的数字x,满足以下条件(d[i]为x的第i位数字)
a[i]==-1时,d[i]<d[i+1]
a[i]== 0时,d[i]==d[i+1]
a[i]== 1时,d[i]>d[i+1]
n<=1e5.若有多解 输出值最大的x,无解输出-1.
z<.>.>.>x<.<.<.>y x和y,z没有关系,考虑第i位数最大为多少?
题意:给出长度为n-1的序列a,要求构造出一个n位数的数字x,满足以下条件(d[i]为x的第i位数字)
a[i]==-1时,d[i]<d[i+1]
a[i]== 0时,d[i]==d[i+1]
a[i]== 1时,d[i]>d[i+1]
n<=1e5.若有多解 输出值最大的x,无解输出-1.
z<.>.>.>x<.<.<.>y x和y,z没有关系,考虑第i位数最大为多少?
第i位前面有p个1 第i位(包扩i)有连续q个-1. 则第i位最大为9-max(p,q) 满足该限制即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int p[N];
int n,a[N],ed[N],st[N];
vector<int> v;
void init()
{
for(int i=1;i<=n;i++)
{
if(a[i-1]==1)
ed[i]=ed[i-1]+1;
if(a[i-1]==0)
ed[i]=ed[i-1];
}
for(int i=n;i>=1;i--)
{
if(a[i]==-1)
st[i]=st[i+1]+1;
if(a[i]==0)
st[i]=st[i+1];
}
}
int main()
{
cin>>n;
for(int i=1;i<=n-1;i++)
scanf("%d",&a[i]);
a[n]=2;
init();
int up,pre;
for(int i=1;i<=n;i++)
{
if(i==1)
{
up=9-st[i];
v.push_back(up);
}
else if(i==n)
{
up=9-ed[i];
v.push_back(up);
}
else
{
up=9-max(ed[i],st[i]);
v.push_back(up);
}
pre=up;
}
bool flag=true;
for(int i=0;i<v.size();i++)
{
if(i==0&&v[i]==0)
flag=false;
if(v[i]>9||v[i]<0)
flag=false;
}
if(flag==false)
{
puts("-1");
return 0;
}
for(int i=0;i<v.size();i++)
printf("%d",v[i]);
return 0;
}