试题编号: | 201712-2 |
试题名称: | 游戏 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。 输入格式 输入一行,包括两个整数n和k,意义如题目所述。 输出格式 输出一行,包含一个整数,表示获胜的小朋友编号。 样例输入 5 2 样例输出 3 样例输入 7 3 样例输出 4 数据规模和约定 对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。 |
解题思路:
这是一个约瑟夫环问题,我用队列来实现的。n个小朋友依次入队(假设围成了一个圈),count为计数器(用来记录报数)。排在队首的小孩报的数若是k的倍数或其个位数为k,则将该小孩淘汰。若小孩没有被淘汰则把他放入队尾继续转圈报数。
100分代码:
#include <bits/stdc++.h>
using namespace std;
bool Out(int count,int k) //判断小孩是否被淘汰
{
if(count%k==0||count%10==k) //若一个小朋友报的数为k的倍数或个位数为k
{
return true; //将该小孩淘汰出局
}
return false;
}
int main()
{
int n,k;
cin >> n >> k;
queue<int> q;
int count = 0; //计数器
for (int i = 1; i <= n; i++)
{
q.push(i); //n个小朋友依次入队
}
while(q.size()>1)
{
count++;
int temp = q.front(); //读取队首元素
q.pop(); //删除队首元素
if(!Out(count,k)) //若该小孩没有被淘汰,则加入队尾继续转圈报数
{
q.push(temp);
}
}
cout << q.front() << endl;
return 0;
}