操作序列
题目描述
小易有一个长度为n的整数序列,a_1,...,a_n。然后考虑在一个空序列b上进行n次以下操作:
1、将a_i放入b序列的末尾
2、逆置b序列
小易需要你计算输出操作n次之后的b序列。
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 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; }