幸运者
幸运者
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 50 Accepted Submission(s) : 29
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
有N个人围成一圈, 并依次编号 1~N,从编号为 1 的人开始循环报数,按顺时针方向报数,凡报到M的人就退出圈子,剩下的人继续报数,最后剩下的一个人就是幸运者。如果你想成为最后一个幸运儿,请问开始时应该站在什么位置?(设 3<=N<=50,1<=M<=N)
Input
本题有多个测试用例
一个用例输入一行2个数,第一个数为开始时的人数 N,第二个数为报到的数M。
一个用例输入一行2个数,第一个数为开始时的人数 N,第二个数为报到的数M。
Output
输出为一行,输出为幸运儿的开始时位置
Sample Input
30 7
Sample Output
23
解释:
和约瑟夫环类似,数据量不是很大,用模拟就可以过了。模拟报数,模拟出队,在没在队列中,用数组标记。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 const int N = 52; 6 7 int main () { 8 int n, m; 9 10 while (cin >> n >> m) { 11 bool flag[N]; 12 memset(flag, 0, sizeof(flag)); 13 int tp = 0, ss = 1; 14 int t = n; 15 while (t > 1) { 16 if (!flag[tp]) { 17 18 if (ss == m) { 19 ss = 1; 20 t--; 21 flag[tp] = true; 22 } else { 23 ss++; 24 } 25 26 } 27 tp = (tp + 1) % n; 28 } 29 while(flag[tp]) tp = (tp + 1) % n; 30 printf("%d\n", tp + 1); 31 } 32 return 0; 33 }