CSP-201712-2-游戏
解题思路
-
初始化变量:定义整数变量
n
和k
,分别用来存储小朋友的总数和淘汰的特定数字。然后定义了num
(用来记录当前报的数)和peopleIndex
(用来记录当前报数的小朋友的索引)。 -
初始化小朋友数组:通过一个循环,创建一个
peopleArr
数组,这个数组中的每个元素代表一个小朋友的编号,从1到n。 -
游戏逻辑处理:使用一个
while
循环来模拟报数和淘汰过程。这个循环会一直执行,直到只剩下一个小朋友(即peopleArr
的大小变为1)。 -
淘汰规则:在每次循环中,首先检查当前报的数(
num
)是否满足淘汰条件:如果num
是k
的倍数或者num
的个位数等于k
,那么当前报数的小朋友就会被淘汰。如果满足淘汰条件,使用erase
方法从peopleArr
中移除当前小朋友,并且人数n
减一。如果被淘汰的是当前队列的最后一个人,则peopleIndex
会通过% n
自动回到队列开头。 -
更新报数和索引:如果当前小朋友没有被淘汰,那么报数索引
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;
}