网易内推(操作序列)

小易有一个长度为n的整数序列,a_1,...,a_n。然后考虑在一个空序列b上进行n次以下操作:
1、将a_i放入b序列的末尾
2、逆置b序列
小易需要你计算输出操作n次之后的b序列。 

输入描述:
输入包括两行,第一行包括一个整数n(2 ≤ n ≤ 2*10^5),即序列的长度。
第二行包括n个整数a_i(1 ≤ a_i ≤ 10^9),即序列a中的每个整数,以空格分割。



输出描述:
在一行中输出操作n次之后的b序列,以空格分割,行末无空格。

 

输入例子1:
4
1 2 3 4

 

输出例子1:
4 2 1 3

方法一:(只通过50%case) 原因:暴力求解复杂度太高
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(vector<int>b)
{
    for(int i=0; i<b.size();i++)
    {
        cout<<b[i]<<" ";
    }
    cout<<endl;
}
int main()
{
    int N;
    cin>>N;
    vector<int>b;
    int x;
    while(N--)
    {
        cin>>x;
        b.push_back(x);
        reverse(b.begin(),b.end());
        if(N==0)
        print(b);
    }
    return 0;
}

 方法二:

观察排列的情况可以得出结论:

如果n是奇数,则先倒序输出奇数(n,n-2,...,1)然后是升序的偶数(2,4,...,n-1);

如果n是偶数,则先倒序输出偶数(n,n-2,...,2)然后是升序的奇数(1,3,....,n-1)

#include<iostream>
#include<vector>
#include<algorithm>
const int maxn=2e5;
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[maxn];
    for(int i=1;i<=n;i++)//注意数组的初始化
    {
        int x;
        cin>>x;
        a[i]=x;
    }
    if(n%2)
    {
        for(int i=n;i>=1;i-=2)  cout<<a[i]<<" ";
        for(int i=2;i<=n;i+=2)
            i==n-1?cout<<a[i]:cout<<a[i]<<" ";
    }
    else
    {
        for(int i=n;i>=1;i-=2) cout<<a[i]<<" ";
        for(int i=1;i<=n;i+=2)
            i==n-1?cout<<a[i]:cout<<a[i]<<" ";
    }
    return 0;
}

 

posted @ 2017-08-23 14:36  泡面小王子  阅读(487)  评论(0编辑  收藏  举报