网易内推(操作序列)
小易有一个长度为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; }
每天明白一点知识