题目:B4295 [蓝桥杯青少年组国赛 2022] 报数游戏
题目描述
某班级男生人数为 X X X 人,女生人数为 Y Y Y 人,现全班同学围成一个圆圈,并按照顺时针方向为每名同学编号(从 1 1 1 到 X + Y X+Y X+Y)。现给出一个正整数 K K K( 2 < K < ( X + Y ) 2<K<(X+Y) 2<K<(X+Y)),从编号为 1 1 1 的同学开始顺时针方向报数,报到 K K K 的同学退出圆圈,下一名同学继续从 1 1 1 报数,再次报到 K K K 的同学退出圆圈。如此循环,直到剩余人数为 X X X 时游戏结束。
请你计算出游戏开始时 X X X 名男生分别应该排在什么位置,才能保证每次离开的都是女生,游戏结束时剩余 X X X 人都是男生。并将游戏开始时每名男生的位置编号按照从小到大顺序输出。
例如: X = 5 X=5 X=5, Y = 3 Y=3 Y=3, K = 3 K=3 K=3, 8 8 8 名同学按照如下图的顺序排列(蓝色为男生位置,红色为女生位置),可以使 3 3 3 轮报数过后最后剩余的 5 5 5 名同学都为男生。故 5 5 5 名男同学的编号分别为 2 2 2、 4 4 4、 5 5 5、 7 7 7、 8 8 8。
输入格式
输入三个正整数 X X X、 Y Y Y、 K K K( 3 ≤ X ≤ 100 3 \leq X \leq 100 3≤X≤100, 3 ≤ Y ≤ 100 3 \leq Y \leq 100 3≤Y≤100, 2 < K < ( X + Y ) 2 < K < (X+Y) 2<K<(X+Y)), X X X 表示男生人数, Y Y Y 表示女生人数, K K K 表示报数的关键数字,三个正整数之间以一个空格隔开。
输出格式
输出 X X X 个整数,表示每名男生位置编号按照从小到大的顺序排列,编号之间以一个空格隔开。
输入输出样例 #1
输入 #1
5 3 3
输出 #1
2 4 5 7 8
代码(10分)
#include<iostream>
using namespace std;
const int MaxXY = 200 + 10;
int X, Y, K;
int out[MaxXY];
int main(){
cin >> X >> Y >> K;
int nv = Y;
int i = 1;
while(nv --){
int t = 1;
while(t < K){
// cout << "i: " << i << " out[i]: " << out[i] << endl;
if(!out[i]){
i = (i + 1) % (X + Y + 1);
if(i == 0){
i ++;
}
t ++;
}
else{
while(out[i]){
i = (i + 1) % (X + Y + 1);
if(i == 0){
i ++;
}
}
t ++;
}
}
if(out[i]){
while(out[i]){
i = (i + 1) % (X + Y + 1);
if(i == 0){
i ++;
}
}
}
// cout << "i: " << i << endl;
out[i] = 1;
i = (i + 1) % (X + Y + 1);
if(i == 0){
i ++;
}
}
for(int i = 1; i <= (X + Y); i ++){
if(!out[i]){
cout << i << " ";
}
}
return 0;
}