幸运者

幸运者

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。

Output

输出为一行,输出为幸运儿的开始时位置

Sample Input

30 7

Sample Output

23

解释:

和约瑟夫环类似,数据量不是很大,用模拟就可以过了。模拟报数,模拟出队,在没在队列中,用数组标记。

 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 }
View Code

猜你喜欢

转载自www.cnblogs.com/gznb/p/11208001.html