题目描述
某班级男生人数为 XX 人,女生人数为 YY 人,现全班同学围成一个圆圈,并按照顺时针方向为每名同学编号 1∼X+Y1∼X+Y。现给出一个正整数 K(2<K<X+Y)K(2<K<X+Y),从编号为 11 的同学开始顺时针方向报数,报到 KK 的同学退出圆圈,下一名同学继续从 11 报数,再次报到 KK 的同学退出圆圈。如此循环,直到剩余人数为 XX 时游戏结束。
请你计算出游戏开始时 XX 名男生分剧应该排在什么位置,才能保证每次离开的都是女生,游戏结束时剩余 XX 人都是男生。并将游戏开始时每名男生的位置编号按照从小到大顺序输出。
例如: X=5.Y=3,K=3X=5.Y=3,K=3,88 名同学按照如下顺序排列,可以使 33 轮报数后剩余的 55 名同学都为男生(蓝色为男生位置,红色为女生位置)。
故五名男同学的编号分别为 2,4,5,7,82,4,5,7,8。
输入格式
输入三个正整数 X,Y,K(3≤X≤100,3≤Y≤100,2<K<X+YX,Y,K(3≤X≤100,3≤Y≤100,2<K<X+Y,XX 表示男生人数,YY 表示女生人数,报数为 KK 的同学退出圆圈,三个正整数之间以一个空格隔开。
输出格式
将每名男生位置编号按照从小到大的顺序输出,编号之间以一个空格隔开。
思路:每次数k个同学,并将这个同学标记,下次跳过他即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int x,y,k,n,res,pos,cnt,vis[100005];
int main(){
ios::sync_with_stdio(false);
cin>>x>>y>>k;
n=res=x+y;
while(res>x){
while(vis[pos])pos=(pos+1)%n;
cnt++;
if(cnt==k)vis[pos]=1,cnt=0,--res;
pos=(pos+1)%n;
}
for(int i=0;i<n;i++)if(!vis[i])cout<<i+1<<" ";
return 0;
}