操作序列

题目描述

小易有一个长度为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

输出

复制
4 2 1 3


思路:近似将1,2操作看作是,这次是奇数操作时,往队列末尾插入数,这次是偶数操作时,往队列前端插入数,如果一共有偶数次操作,正序输出队列,如果一共有奇数次操作,逆序输出队列
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<deque>
using namespace std;
int main()
{
    deque<int> d;
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int k;
        scanf("%d",&k);
        if(i%2==0){
            d.push_back(k);
        }else{
            d.push_front(k);
        }
    }
    if(n%2==1){
        deque<int>::reverse_iterator it;
        for(it=d.rbegin();it!=d.rend();it++){
            cout<<*it<<" ";
        }
        
    }else{
        deque<int>::iterator it;
        for(it=d.begin();it!=d.end();it++){
            cout<<*it<<" ";
        }    
    }
    return 0;
}

优秀题解:

 

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int a[maxn];
int n;
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    if(n % 2) {
        for(int i = n; i >= 1; i -= 2) printf("%d ", a[i]);
        for(int i = 2; i <= n; i += 2) i == n - 1 ? printf("%d", a[i]) : printf("%d ", a[i]);
    } else {
        for(int i = n; i >= 1; i -= 2) printf("%d ", a[i]);
        for(int i = 1; i <= n; i += 2) i == n - 1 ? printf("%d", a[i]) : printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

 

posted @ 2019-04-26 17:49  萌新上路  阅读(261)  评论(0编辑  收藏  举报