ZJYYCOJ——问题 B: lzy的烦恼(约瑟夫环问题)

本文介绍了一个约瑟夫问题的变种,通过设计算法找出在特定规则下最后剩下的个体编号。提供了一段C++实现代码,能够处理多组测试数据,并输出每组数据最后幸存者的编号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 B: lzy的烦恼

链接:http://acm.oinsm.com/problem.php?cid=1007&pid=1

题目描述

lzy刚ac了一道简单的约瑟夫环问题,就叫嚣着自己已经完全学会了约瑟夫问题,(如果不知道约瑟夫问题的童鞋请看下面提示)
姐姐对lzy嚣张的气焰很不爽,于是出了一套约瑟夫环来难为他,现在lzy向你求救,请你设计一个算法帮他解决这个问题.

输入

题目有多组测试数据, 每组以一个整数T开始,表示有T组样例;
接下来有T行,每行有一个整数n和m(1<=n<=100,1<=m<=10),
表示总共有n个人和报数报到m的倍数的人出列(人的编号从1到n);

输出

根据每组输入,请输出最后剩下的人的编号;
每组答案都在单独一行;

样例输入

2
1 1
10 3

样例输出

1
4

正确代码:

#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
	int t;
	while(cin>>t){
		while(t--){
			int n,m;
			cin>>n>>m;
			int vis[n+5];
			for(int i=1;i<=n;i++){
				vis[i]=0;
			}
			int ren=n;
			int ans=1;
			int k=1;
			while(ren){
				//cout<<ren<<" "<<ans<<endl;
				for(int i=1;i<=n;i++){
					if(ans>m){
						ans=1;
					}
					//cout<<i<<endl;
					if(vis[i]==0){
						if(ren==1){
							k=i;
							ren--;
							break;
						}
						if(ans%m==0&&ren>1){
							ren--;
							vis[i]=1;
							//cout<<i<<" "<<ren<<endl;
						}
						
						ans++;
					}
				}
			}
			cout<<k<<endl;
		}
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值