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 }
复制代码

 

posted @   cheng102e  阅读(192)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示