描述
前N个自然数排成一串:x1,x2,x3…Xn。先取出x1,将x2,x3移到数串尾,
再取出x4,将x5,x6移到数串尾,...类推直至取完,取出的序列恰好是:1,2,3...... N。要求输入N,求原来数串的排列方式。
输入格式
只有一个数为N(N≤100)。
输出格式
只有一行,为原来数串的排列方式。
样例输入
5
样例输出
1 5 3 2 4
int n,p=0,q,a[305]={},b[105]={};
cin>>n;
q=n;
for(int i=1;i<=n;i++)
{
a[i]=i;
}
for(int i=1;i<=n;i++)
{
b[i]=a[++p];
a[++q]=a[++p];
a[++q]=a[++p];
}
for(int i=1;i<=n;i++)
{
a[b[i]]=i;
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
解释一下
我这个思路清奇(主要因为开始没看清题)(反向推理一波)
首先模拟一遍,假设原序列为{1,2,3,...}
p标记队头的位置,q标记队尾的位置
b为输出序列
若输出应该是b_real{1,2,3,...},则b中的第n个元素k应该为n
那么a中的第k个元素(原本是k)应该改成n
操作完的a就是原来应该为的数列,输出就好