8612 发牌
时间限制:500MS 内存限制:1000K
提交次数:134 通过次数:61
题型: 编程题 语言: G++;GCC
Description ACM队员去其它城市参加亚洲区预赛往往要坐10多个小时的火车。在车上为了打发时间,有时他们也玩纸牌。下面是一个关于发牌的问题。
现有发牌人手上有N张牌,先把放在最上面的牌放到桌上,接着把剩下的N-1张牌最上面的一张取出放到这叠牌的最下面。这样算完成了一次操作。接着再次将最上面一张放到桌上,把剩下的N-2张牌最上面的一张取出放到最下面……直到最后一张牌被放到桌面上。
举个例子:
一开始手上的牌分别是1,2,3,4,(从上到下),先把1放在桌上,然后把2放在4的后面,所以手上的牌就是3,4,2了,接着把3放在桌上,把4放在2的后面,这时手上的牌就是2,4了,不断重复这个过程,直到手上的牌都放到桌面为止。
现在,如果告诉你牌的总数N(编号为1到N),以及最终这N张牌放到桌面上的顺序正好是1,2,3,….,N。
问最开始放在手上的那N张牌的顺序!!
输入格式 多行,一行一个正整数N。(1<=N<=500)
最后一行是0,表示结束,不用处理
输出格式 每行一个排列,数与数之间用空格隔开。
输入样例 2
3
0
输出样例 1 2
1 3 2
题意:给出数字N,要求求出出牌顺序为1,2,3,4,5….N的原来牌序列
解题思路:超级水题….把过程反过来就好,n=1,2时不需要放到后面,n大于3的时候,先放进大n,n-1的两张牌,然后把n-2放进去,再把n提前,最后反过来输出.
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
int a[505];
int main()
{
queue<int> q;
int n,sum,temp;
while(scanf("%d",&n),n!=0)
{
if(n==1)
{
printf("1\n");
}
else if(n==2)
{
printf("1 2\n");
}
else
{
sum=n;
q.push(n--);
q.push(n);
while(--n)
{
temp=q.front();
q.pop();
q.push(temp);
q.push(n);
}
for(int i=sum;i>=1;i--)
{
temp=q.front();
a[i]=temp;
q.pop();
}
for(int i=1;i<=sum;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
}
return 0;
}