C - Restore the Array Div3比赛有感

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值