C - Restore the Array
算法思维: 构造加贪心
按照题意我们需要构造一个序列使得序列中每两项元素得到的最大值元素所构造出的新序列与原输入序列相同。
先理解题意:
输入:
4(构造一个长度为4的序列)
1 2 3(输入一个长度为3的序列)
输出:
1 1 2 3
按照这个构造序列我们求得新序列为
max(1,1) = 1
max(1,2) = 2
max(2,3) = 3
符合条件
从这一个来说我们是不是找到了一个规律:也就是我们所需值的前一项必须要小于或者等于
我们那一所需项的值
再通过一个样例进行说明:
输入:
5
4 2 5 5
输出:
4 2 2 5 5
构造条件:
我们所需值的前一项必须要小于或者等于我们那一所需项的值
需要注意的是我们输出是从第一项的前一项开始构造的 那么也就是说我们要把arr[0]开到
很大
看到这里你应该明白了这个构造规律了 下面是代码展示:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
int times,n;
int arr[N];
int ans[N];
void solve()
{
memset(arr,2e9+10,sizeof arr);
cin>>n;
for(int i=1;i<=n-1;i++)cin>>arr[i];
for(int i=0;i<=n-1;i++)cout<<min(arr[i],arr[i+1])<<" ";
cout<<"\n";
for(int i=1;i<=n-1;i++)arr[i]=0;
}
signed main()
{
cin >> times;
while (times--)
{
solve();
}
return 0;
}