ACM复习(13)8612 发牌
来源:互联网 发布:全球最贵域名 编辑:程序博客网 时间:2024/06/07 20:19
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
解题思路
这道题其实就是 m = 2 的1139 约瑟夫环问题,代码思路直接参考就行
#include<stdio.h>int main(){ int num[502], n, space, start; while(scanf("%d", &n) && n != 0) { start = space = 0; for(int i = 0; i < 502; i ++) num[i] = 0; for(int i = 1; i <= n; i ++) { if(i == 1) num[0] = 1; else if(i == n) { for(int k = 0; k < n; k ++) { if(num[k] == 0) { num[k] = i; break; } } } else { for(int j = start + 1; ; j ++) { if(j == n) j -= n; if(num[j] == 0) { space ++; if(space == 2) { num[j] = i; start = j; space = 0; break; } } } } } for(int i = 0; i < n; i ++) printf("%d ", num[i]); printf("\n"); } return 0;}
阅读全文
0 0
- ACM复习(13)8612 发牌
- 8612 发牌
- ACM复习(1)1077 韩信点兵
- ACM复习(2)1078 破密
- ACM复习(6)1144 数星星
- ACM复习(7)1079 三角形
- ACM复习(11)8615 快乐
- ACM复习(14)8613 锁
- ACM复习(15)8614 素数
- 发牌程序(一)
- 发牌程序(二)
- 发牌程序(三)
- 发牌算法(java)
- Java(发牌机器)
- c++ 斗地主发牌程序中级(分配发牌算法)
- [ACM] hdu 1465 不容易系列之一(错排复习)
- [ACM] POJ 1088 滑雪 (记忆化搜索复习)
- ACM复习(3)1139 约瑟夫环问题
- PHP时间戳函数和日期转换
- 微服务场景下的自动化测试
- java中锁的使用
- Linux C 怎么检测网络状态
- PTA基础编程 7-16 求符合给定条件的整数集
- ACM复习(13)8612 发牌
- java并发中的CAS
- 0-1背包回溯【Java】
- 外卖哥
- Qt获取所有进程、终止某个进程
- C语言实现通讯录-动态内存
- 用于目标检测的rcnn,fast-rcnn,faster-rcnn
- 姿态论文整理--04-Human pose estimation using global and local normalization
- 渗透入门学习之http数据包