问题 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;
}