Acwing-玩游戏

这篇博客探讨了一个涉及n个孩子围成一圈玩数数游戏的算法问题。游戏规则是孩子们按顺时针顺序编号,领头人开始数指定次数的人,最后数到的孩子淘汰,下一轮由其顺时针下一位接替领头人。文章通过示例解释了游戏过程,并提供了一段C++代码实现,用于找出每轮被淘汰的孩子编号,展示了如何处理循环和淘汰逻辑。
摘要由CSDN通过智能技术生成

https://www.acwing.com/problem/content/4403/

nn 个小朋友围成一圈,玩数数游戏。

小朋友们按顺时针顺序,依次编号为 1∼n1∼n。

初始时,11 号小朋友被指定为领头人。

游戏一共会行进 kk 轮。

在第 ii 轮中,领头人会从他的顺时针方向的下一个人开始,按顺时针顺序数 aiai 个人。

其中,最后一个被领头人数到的人被淘汰出局,这也意味着该轮游戏结束。

出局者的顺时针方向的下一个人被指定为新领头人,引领新一轮游戏。

例如,假设当游戏即将开始第 ii 轮时,还剩下 55 个小朋友,编号按顺时针顺序依次为 8,10,13,14,168,10,13,14,16,并且当前领头人为 1313 号小朋友,ai=12ai=12,则第 ii 轮游戏结束后,最后一个被数到的小朋友为 1616 号小朋友,他将被淘汰出局,并且处于其下一位的第 88 号小朋友将被指定为新领头人。

现在,请你求出每一轮次被淘汰的小朋友的编号。

输入格式

第一行包含两个整数 n,kn,k。

第二行包含 kk 个整数 a1,a2,…,aka1,a2,…,ak。

输出格式

一行,kk 个整数,其中第 ii 个整数表示在第 ii 轮中被淘汰的小朋友的编号。

数据范围

前三个测试点满足 2≤n≤102≤n≤10。
所有测试点满足 2≤n≤1002≤n≤100,1≤k≤n−11≤k≤n−1,1≤ai≤1091≤ai≤109。

输入样例1:

7 5
10 4 11 4 1

输出样例1:

4 2 5 6 1

输入样例2:

3 2
2 5

输出样例2:

3 2
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
bool flag[350];
int main(){
	memset(flag,false,sizeof(flag));
	int n,k;
	int a[350];
	int t=1;     //最妙的一笔,把t放在循环外,就可以知道上次淘汰的位置了
	cin>>n>>k;
	for(int i=1;i<=k;i++){
		cin>>a[i];
		a[i]%=(n-i+1);   //不用遍历好几圈,仅一圈就能找到要淘汰的数
		while(a[i]--){
			if(t==n) t=1; //实现尾到头的转换
			else t++;
			if(flag[t]){  //说明t已经被淘汰过
				a[i]++;
			} 
		}
		flag[t]=true;
		cout<<t<<" ";
		while(flag[t]){ //找到下一个队头
			t==n?t=1:t++;
		}
	} 
	cout<<endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值