CCF 201712-2 游戏

题目:

  问题描述
    有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。
    游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。
    例如,当n=5, k=2时:
    1号小朋友报数1;
    2号小朋友报数2淘汰;
    3号小朋友报数3;
    4号小朋友报数4淘汰;
    5号小朋友报数5;
    1号小朋友报数6淘汰;
    3号小朋友报数7;
    5号小朋友报数8淘汰;
    3号小朋友获胜。

    给定nk,请问最后获胜的小朋友编号为多少?
  输入格式
    输入一行,包括两个整数nk,意义如题目所述。
  输出格式
    输出一行,包含一个整数,表示获胜的小朋友编号。
  样例输入
  5 2
  样例输出
  3
  样例输入
  7 3
  样例输出
  4
  数据规模和约定
    对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。

思路:

  约瑟夫问题变种,一圈一圈循环,出局置为1,直到结束游戏。

(sublime的格式分的好开,话说我有点想转github写博客了,makedown舒服很多)

代码:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int N = 10000;
 8     int s[10001];
 9     int n, k, i = 0, sum = 0;
10     cin >> n >> k;
11     int t = n;
12     for (int q=0;q<10001;q++)
13     {
14         s[q]=0;
15     } 
16 
17     while (t > 1)
18     {
19 
20         if (s[i] == 0)
21             sum++;
22         else
23         {
24             i++;
25             if (i >= n)
26                 i %= n;
27             continue;
28         }
29 
30         if (sum % k == 0 || sum % 10 == k)
31         {
32             s[i] = 1;
33             t--;
34         }
35 
36         i++;
37         if (i >= n)
38             i %= n;
39     }
40 
41     for (i = 0; i < n; i++)
42     {
43         if (s[i] == 0)
44             cout << i + 1;
45     }
46     return 0;
47 }