问题描述
有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。
游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。
例如,当n=5, k=2时:
1号小朋友报数1;
2号小朋友报数2淘汰;
3号小朋友报数3;
4号小朋友报数4淘汰;
5号小朋友报数5;
1号小朋友报数6淘汰;
3号小朋友报数7;
5号小朋友报数8淘汰;
3号小朋友获胜。
给定n和k,请问最后获胜的小朋友编号为多少?
输入格式
输入一行,包括两个整数n和k,意义如题目所述。
输出格式
输出一行,包含一个整数,表示获胜的小朋友编号。
样例输入
5 2
样例输出
3
样例输入
7 3
样例输出
4
数据规模和约定
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。
思路
设两个队列,先把所有的小朋友存入一个队列里面,然后“数数”–将未出局的小朋友存入另外一个队列;周而复始,最后只剩下最后一个小朋友的时候,就完成了。
代码
#include<bits/stdc++.h>
using namespace std;
queue<pair<int,int> > qa, qb; //两个队列,存放pair类型的数据
int n,k;
int main()
{
std::ios::sync_with_stdio(false); //保证 cout 和 cin 的效率
cin >> n>> k;
if(k==1) //k为1,则直接输出 n
{
cout<< n;
return 0;
}
pair<int, int> pa; //一个pair对象
int size = 0, if_a = 1;
for(int i=1; i<=n; i++) //加入qa队列
{
pa.first = i; //表示小朋友的号码数
pa.second = i; //表示小朋友数到的数
qa.push(pa);
}
while(true) //循环---数数环节
{
//在qa队列
if(if_a == 1)
{
size += qa.size(); //数数过程中,在qa队列计数的个数
//从qa队列删除
while(!qa.empty())
{
if_a = 0;
pa = qa.front();
qa.pop();
//不满足淘汰条件
if(pa.second %k != 0 && pa.second %10 != k)
{
pa.second =size + qb.size()+ 1; //小朋友下一轮要数到的数
qb.push(pa);
}
}
}
//在qb队列
else
{
size += qb.size();
while(!qb.empty())
{
if_a = 1;
pa = qb.front();
qb.pop();
if(pa.second %k != 0 && pa.second %10 != k)
{
pa.second =size + qa.size()+ 1;
qa.push(pa);
}
}
}
//剩下最后一个小朋友
if(qa.size() == 1 || qb.size() == 1)
break;
}
if(!qa.empty())
cout <<qa.front().first;
else
cout << qb.front().first;
return 0;
}