1001: 约瑟夫问题-输出最后的编号
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Submitted: 17 Accepted: 16
[Submit][Status][Web Board]
Description
n个人围成一圈,依次从1至n编号。从编号为1的人开始1至k报数,凡报数为k的人退出圈子,输出最后留下的一个人原来的编号。
Input
首先输入一个t,表示有t组数据(1<= t <= 10010)
然后有t行,每行有2个正整数n和k。(1<= n,k<= 20)
Output
对于每组测试数据,输出一个数,表示最后留下来的人的编号。
Sample Input
3
10 3
7 1
5 4
Sample Output
4
7
1
HINT
例如第三组样例:5个人围成一圈,编号1-5。第一轮报数4号出列,第二轮从5开始报数1,3报4,3出列,第三轮从5开始报1,5报4,5出列,第四轮1开始报1,2报4,2出列,最后剩下的为1号。
#include <iostream>
#include <queue>
#include<stdio.h>
#include<string.h>
#include<stack>
#include<map>
#include<climits>
#include<algorithm>
using namespace std;
int main()
{
int a[22]={0};
int n,m,k;
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);//不用管
while(cin>>m)
{
while(m--)
{
cin>>n>>k;
for(int i=1;i<=n;i++)a[i]=1;
//代表他们都还没有被赶走
int j=1;
int i=0;
int sum=0;
while(i<k)
{
i+=a[j];//这样子被赶走的人的报数不算到里面
if(i==k)
{
a[j]=0;//代表那个人被赶走了
i=0;
sum++;
if(sum==n)//当赶走的人数和人的总数一样循环结束
break;
}
j++;
if(j==n+1)j=1;//当到n号的人的时候,下一个为n+1
}
printf("%d\n",j);
}
}
}