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--; // 總人數-1peopleIndex = peopleIndex % n; // 更新循環隊列}else{peopleIndex = (peopleIndex + 1) % n; // 更新循環隊列} num++; // 報數+1}cout << peopleArr[0];return 0;
}