题目描述
魔法师在玩一种扑克牌游戏,n张扑克分别记上1,2,……,n他打开第一张是1,把它放在一边。然后把最上面的两张一张一张地依次移到最后,打开上面一张刚好是2,再放在一边;然后把上面的3张一张一张移到最后,打开上面一张刚好是3,再放到一边;……如此重复下去,直到打开最后一张是n,放在一边;这时他发现,放在一边的扑克刚好是1,2,……,n这样排列的。请编程输出这些扑克原来是怎么排列的。
输入
一行一个正整数n
输出
一行n个正整数,表示这些扑克牌原来的排列顺序,每两个数之间有一个空格。
样例输入 Copy
【输入样例1】 5 【输入样例2】 9
样例输出 Copy
【输出样例1】 1 4 5 2 3 【输出样例2】 1 8 6 2 9 4 5 3 7
提示
数据范围:
70%的数据:n<=100;
30%的数据:n<=10000
我稍微给大家来点注释吧,这样的写法确实能比你单独的用链表啥的 做代码复杂度降低了很多的,主要是for循环那块,这样写主要出发点就是从末尾元素开始,假设你的所有元素已经出队完成,从最后一个出队的元素开始,在慢慢的向前推进,q.size()是指你在出这个元素之前的队里有多少元素,那么你就需要移动队里的元素多少次,因为你移动的次数由当前数的大小来决定,那么当x循环到1的时候你是不需要在循环一次,所以前面加了代码当x=1时直接跳出循环,由于他是逆序进入的,所以最后输出的时候也应该逆序输出。
#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
int a[10000];
int main()
{
int n;
cin >> n;
int x = n;
for (int i = n; i >= 1; i--)
{
q.push(x);
if (x == 1)
{
break;
}
for (int j = x % q.size(); j >= 1; j--)
{
q.push(q.front());
q.pop();
}
x--;
}
int i = 1;
while (!q.empty())
{
a[i] = q.front();
q.pop();
i++;
}
for (int i = n; i > 1; i--)
{
cout << a[i] << " ";
}
cout << a[1] << endl;
return 0;
}