时空限制
CPU占用时长: 1秒内存使用限制: 128MB
问题描述
魔法师峰哥在玩一种扑克牌游戏,n张扑克分别记上1,2,……,n,他打开第一张是1,把它放在一边,然后把最上面2张一张一张地依次移到最后,打开上面一张刚好是2,再放在一边;然后把上面3张一张一张移到最后,打开上面一张刚好是3,再放到一边;……,如此继续下去,直到打开最后一张是n,放在一边,这时他发现,放在一边的扑克刚好是1,2,……,n这样排列的。这些扑克原来是怎么排列的?请程序完成这个任务(n <= 10000)。
输入输出样例
输入样例1
5
输出样例1
1 4 5 2 3
输入样例2
9
输出样例2
1 8 6 2 9 4 5 3 7
数据范围与提示
70%的数据 n <= 100
100%的数据 n <= 10000
C++参考代码
#include <bits/stdc++.h>
using namespace std;
queue<int> q;
int ans[100000];
int main(){
int n;
cin>>n;
int x=n;
for(int i=1;i<=n;i++){
q.push(x);
if(x==1)break;
for(int j=x%q.size();j>=1;j--){ //注意循环要取余,不然会容易超时
q.push(q.front());
q.pop();
}
x--;
}
for(int i=1;i<=n;i++){
ans[i]=q.front();
q.pop();
}
for(int i=n;i>=1;i--)
printf("%d ",ans[i]);
return 0;
}