不用队列的做法,就是一个简单模拟,经典的约瑟夫问题的变种
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, k;
bool isInGame[N];
// 判断当前的报数是否合法
bool check(int x){
if(x % k == 0 || x % 10 == k) return false;
return true;
}
int main(){
ios::sync_with_stdio(false);
memset(isInGame, true, sizeof isInGame);
cin >> n >> k;
int cnt = 0, now_id = 1; // cnt是当前玩家的报数,now_id是当前玩家的编号
int less = n; // less先开始为n,如果最后减到1就代表游戏结束
while(less != 1){
if(now_id > n) now_id = 1; // 大于n了就到1
if(isInGame[now_id]){
cnt++;
if(!check(cnt)){
isInGame[now_id] = false; // 淘汰
less--; // 剩余玩家数-1
}
}
now_id++;
}
for(int i = 1; i <= n; i++){
if(isInGame[i]){
cout << i;
return 0;
}
}
return 0;
}