问题描述
伊姐姐热衷于各类数字游戏, 24 点、 2048、数独等轻轻松松毫无压力。一
日,可爱的小姐姐邀请伊姐姐一起玩一种简单的数字 game,游戏规则如下:
一开始桌上放着 n 张数字卡片,从左到右按数字 1-n 放置,小姐姐按以下步
骤取卡片
小姐姐取出最左边的一张牌,藏于袖中;
小姐姐将此时剩余卡牌的最左边的 p 张移到最右边, 假设桌上的牌为 1 2 3 4
5,移动最左边的两张卡片后结果为 3 4 5 1 2。 注意当桌上卡片数量小于 p 时不
进行这步操作。
所有卡牌都被藏起来以后,游戏结束。
这是个十分简单的数字 game, 然而伊姐姐因为紧张丧失游戏能力, 你能帮
助伊姐姐统计, 小姐姐第 k 次,第 2*k 次…第 i*k 次(i<=n/k)藏于袖中的卡片吗?
★数据输入
输入第一行为三个正整数 n(1<=n<=100000),p(0<=p<=10),k(0<k<=100),含
义在题目中给出。
★数据输出
输出为两行,第一行输出你总共要输出的卡片数量 m。
第二行 m 个数, 按顺序输出小姐姐第 k 次,第 2*k 次…第 m*k 次藏的卡片。
输入示例 | 输出示例 |
6 3 2 | 3 5 6 3 |
输入示例 | 输出示例 |
10 1 3 | 3 5 2 8 |
思路
测试数据较小,暴力
code
1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 #include <queue> 5 6 int main() 7 { 8 int i,j; 9 int n,p,k; 10 bool first=true; 11 12 scanf("%d %d %d",&n,&p,&k); 13 printf("%d ",n/k); 14 15 queue<int> q; 16 for(i=1;i<=n;i++) 17 q.push(i); 18 19 for(i=1; i<=n; i++) 20 { 21 if(i%k==0) 22 { 23 if(first) 24 { 25 first = false; 26 printf("%d",q.front()); 27 } 28 else 29 printf(" %d",q.front()); 30 } 31 q.pop(); 32 if(q.size()>p)//(q.size()>=p) 33 { 34 for(j=1;j<=p;j++) 35 { 36 q.push(q.front()); 37 q.pop(); 38 } 39 } 40 } 41 42 return 0; 43 }