厦门网站建设哪家好厦门最好的网站建设,湖南住建云网站,php wordpress配置,网页免费制作网站题目 问题描述有n个小朋友围成一圈玩游戏#xff0c;小朋友从1至n编号#xff0c;2号小朋友坐在1号小朋友的顺时针方向#xff0c;3号小朋友坐在2号小朋友的顺时针方向#xff0c;……#xff0c;1号小朋友坐在n号小朋友的顺时针方向。游戏开始#xff0c;从1号小朋友开始…题目 问题描述 有n个小朋友围成一圈玩游戏小朋友从1至n编号2号小朋友坐在1号小朋友的顺时针方向3号小朋友坐在2号小朋友的顺时针方向……1号小朋友坐在n号小朋友的顺时针方向。 游戏开始从1号小朋友开始顺时针报数接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数即数的个位为k则该小朋友被淘汰出局不再参加以后的报数。当游戏中只剩下一个小朋友时该小朋友获胜。 例如当n5, k2时 1号小朋友报数1 2号小朋友报数2淘汰 3号小朋友报数3 4号小朋友报数4淘汰 5号小朋友报数5 1号小朋友报数6淘汰 3号小朋友报数7 5号小朋友报数8淘汰 3号小朋友获胜。 给定n和k请问最后获胜的小朋友编号为多少 输入格式 输入一行包括两个整数n和k意义如题目所述。 输出格式 输出一行包含一个整数表示获胜的小朋友编号。 样例输入 5 2 样例输出 3 样例输入 7 3 样例输出 4 数据规模和约定 对于所有评测用例1 ≤ n ≤ 10001 ≤ k ≤ 9。 这道题写了挺长时间主要还是考虑不充分结果屡次没有AC——问题在于用循环跳过已经剔除的人该过程中没有考虑当到达边界条件时位置的归零问题 解题思路 开一个布尔型的数组表示参加游戏的人是否被剔除出游戏初始值设为true表示在游戏中定义一个计数变量cnt表示仍然在游戏中的人数、一个位置变量表示当前报数的是哪个人、当前报的数字i 如果循环中当前报的数字满足题设给出的剔除条件则把数组中当前位置取假表示该位置的参赛者已经被剔除出游戏循环中需要注意三个问题 1. 当位置变量到达人数的上限时表示此时报数的是最后一人此时需要再从第一个人开始因此需要将位置变量重新赋值为0 2. 需要保证每次操作时位置变量对应的布尔类型的数组中的值为true也就是当前位置上的参赛者目前仍然再游戏中否则进行循环直到访问到的参赛者仍然在在游戏中 3. 当计数变量为1时表示游戏中仅剩一个参赛者此时退出循环得出结果。 代码 1 #include iostream2 using namespace std;3 4 int main() {5 bool per[1005];6 for (int i 0; i 1005; i)7 per[i] true;8 int n 0, k 0;9 cin n k;
10 int i 1;
11 int cnt n;
12 int loc 0;
13 while (true) {
14 while (per[loc] false) {
15 loc;
16 if (loc n)
17 loc 0;
18 }
19 if (i % k 0 || i % 10 k) {
20 cnt--;
21 per[loc] false;
22 }
23 i;
24 loc;
25 if (loc n)
26 loc 0;
27 if (cnt 1)
28 break;
29 }
30 for (int i 0; i n; i) {
31 if (per[i] true)
32 cout i 1 endl;
33 }
34
35 return 0;
36 } 转载于:https://www.cnblogs.com/moujun1001/p/9362666.html