自学内容网 自学内容网

CSP-201712-2-游戏

CSP-201712-2-游戏

解题思路

  1. 初始化变量:定义整数变量nk,分别用来存储小朋友的总数和淘汰的特定数字。然后定义了num(用来记录当前报的数)和peopleIndex(用来记录当前报数的小朋友的索引)。

  2. 初始化小朋友数组:通过一个循环,创建一个peopleArr数组,这个数组中的每个元素代表一个小朋友的编号,从1到n。

  3. 游戏逻辑处理:使用一个while循环来模拟报数和淘汰过程。这个循环会一直执行,直到只剩下一个小朋友(即peopleArr的大小变为1)。

  4. 淘汰规则:在每次循环中,首先检查当前报的数(num)是否满足淘汰条件:如果numk的倍数或者num的个位数等于k,那么当前报数的小朋友就会被淘汰。如果满足淘汰条件,使用erase方法从peopleArr中移除当前小朋友,并且人数n减一。如果被淘汰的是当前队列的最后一个人,则peopleIndex会通过% n自动回到队列开头。

  5. 更新报数和索引:如果当前小朋友没有被淘汰,那么报数索引peopleIndex将向前移动一位(考虑到循环队列,所以使用% n)。不管是否淘汰,每次循环结束时报数num都会递增。

完整代码

#include<iostream> 
#include<vector>
using namespace std;
int main() {
    int n, k;
    cin >> n >> k;
    int num = 1, peopleIndex = 0;
    vector<int>peopleArr(n);
    // 人员编号
    for (int i = 0; i < n; i++)
    {
        peopleArr[i] = i + 1;
    }
    while (true)
    {
        if (peopleArr.size() == 1) // 终止条件:只剩一个人
        {
            break;
        }
        if (num % k == 0 || num % 10 == k) { // 淘汰规则
            peopleArr.erase(peopleArr.begin() + peopleIndex); // 移除队伍
            n--; // 总人数-1
            peopleIndex = peopleIndex % n; // 更新循环队列
        }
        else
        {
            peopleIndex = (peopleIndex + 1) % n; // 更新循环队列
        }         
        num++; // 报数+1
    }
    cout << peopleArr[0];
    return 0; 
}

请添加图片描述


原文地址:https://blog.csdn.net/fzy2003/article/details/136413730

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!