报数游戏(第十三届国赛 T2)

题目描述
某班级男生人数为 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;
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值