题目描述
小Z手上有一个长度为n的整数序列a1, a2,…,an,但是他不太喜欢这个序列,因此他想通过一些操作将序列a变成自己想要的序列b。初始时序列b是空的,接下来小Z将依次进行n次操作,其中第i次操作分为以下两步:
1. 将ai加到序列b的尾部;
2. 翻转序列b(即b1,b2,…,bi变成bi,bi-1,…,b1 )。
小Z想知道n次操作之后序列b会是什么样的,你能帮助他吗?
输入
第一行包含一个正整数n;
第二行包含n个正整数,第i个正整数表示ai。
输出
共一行,包含n个数,表示n次操作后的序列b。
样例输入
4 1 2 3 4
样例输出
4 2 1 3
错误做法 按题目要求做,用vector,都会时间超限
正解 找规律
输入 | 输出 |
1 | 1 |
1 2 | 2 1 |
1 2 3 | 3 1 2 |
1 2 3 4 | 4 2 1 3 |
1 2 3 4 5 | 5 3 1 2 4 |
1 2 3 4 5 6 | 6 4 2 1 3 5 |
1 2 3 4 5 6 7 | 7 5 3 1 2 4 6 |
1 2 3 4 5 6 7 8 | 8 6 4 2 1 3 5 7 |
可以发现一个规律输出都是 从大到小,从小到大,而且从中间断开两边的数列前后都是相差二
a b c d e | e c a b d |
a[1] a[2] a[3] a[4] a[5] | a[5] a[3] a[1] a[2] a[1] |
所以其实只用跑2个循环,一个输出左半边的数列,另一个输出右半边的数列
代码实现
#include<iostream>
using namespace std;
long long a[200005],n,i;
int main()
{
cin>>n;
for(i=0;i<n;i++) //输入 不多说
{
cin>>a[i];
}
for(i=n-1;i>=0;i-=2) //左半边序列
{
cout<<a[i]<<" ";
}
if(n%2==1)
{
i=1; //个数为奇数时 第二个序列从a[2]开始
}
else
{
i=0; //个数为偶数时 从第一个开始
}
for(;i<n;i+=2) //右半边序列
{
cout<<a[i]<<" ";
}
return 0;
}
完结撒花!!!!!!!!!!!!!!!!!!!!!!!!!!!!!