这题的难度属于是只要你想到了就很简单,但是想不到就死活做不出来。
我做不出来就是不好.doge
我们来看看这道题,这道题定义的左看是满足大于其左边所有数的一个数列,并且它已经把左看数组给出来了。 右看同理。
那么,如果我们想要构造一个数组让他的左看和右看都满足,那么(因为是严格单增的,不然还要排个序)必须要保证的就是两个数组的最大数值相等。(第一个条件)
不然你不论怎么构造这个数组,这俩最大值都会出现在彼此的数组里。
就比如说左看是{1,5},右看是{1,6},那么6一定会出现在{1,5}里,就构造不出来(这就是最大值不相等的结果)。cout
接下来我们继续分析。
现在我们的左右看数组最大值都相同了。那么,我们要想让左看数组不会包含右看数组的元素,那我们就把左看拼接在左,右看拼接在右就行了。
就比如说左看:{1,3,5} 右看{2,4,5} 1,3,5,4,2
(有最大值拦着就不会出现别的数字)
现在,拼接完毕。
但是还有一点需要考虑,就是我们构造的这个数组一定存在,前提是长度我们自己定。
我们数组的长度最短是x+y-1,不然值覆盖不完。那如果n<x+y-1,直接-1,因为这是不可能存在的。
否则: 我们就先输出左看和右看数组,再在结尾补右看的最后一个数直到补满长度就行。 因为最后一个数都是等价的,你输入几个也不会有影响。
所以综上代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x,y,n;
cin>>x>>y>>n;
vector<int> c(x+1);
vector<int> d(y+1);
for(int i=1;i<=x;i++)
cin>>c[i];
for(int i=1;i<=y;i++)
cin>>d[i];
if(x+y-1>n)
{
cout<<-1;
return 0;
}
else if(c[x]!=d[y])
{
cout<<-1;
return 0;
}
else{
for(int i=1;i<=x;i++)
cout<<c[i]<<' ';
for(int i=y-1;i>=1;i--)
cout<<d[i]<<' ';
for(int i=1;i<=n-(x+y-1);i++)
cout<<d[1]<<" ";
}
}
一个蒟蒻的代码罢辽
就这样,到此一游。

京公网安备 11010502036488号