题:报数游戏
有 n ( 1< n<10000)个小朋友站成一个圆圈。
选定一个小朋友为1号,从他(她)开始顺时针编号:1,2,3,4,…
游戏开始! 从1号小朋友起,顺时针报数,从1报起。
即:1号小朋友报1,2号小朋友报2,3号小朋友报3, ….
游戏规定,报到数字 m(1 < m <100) 的小朋友立即退出报数圈。
在他(她)的顺时针方向的下一个小朋友(如果有的话)开始重新从1报数…
游戏这样一直进行下去,直到圈中只剩下一个小朋友。
求最后剩下的小朋友的编号。
输入:两个整数,n 和 m, 用空格分开。含义如上。
输出:一个整数,表示最后剩下的小朋友的编号。
比如:
输入:
15 3
程序应该输出:
5
再比如:
输入:
7 4
程序应该输出:
2
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
分析:
删除报到数的”孩子”直到容器大小等于1
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, m; //n孩子数 m报数
cin >> n >> m;
vector<int>vec(n);
for(int i = 0; i < n; i++) {
vec[i] = i+1;
}
int x = 0;
while(1) {
x = (x+m-1) % vec.size();
vec.erase(vec.begin()+x); //删除下标为x的"孩子"
if(vec.size() == 1) {
cout <<vec[0]; //剩下的最后一个"孩子"
break;
}
}
return 0;
}