蓝桥杯模拟赛:报数游戏(vector解决约瑟夫环)

题:报数游戏

有 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;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值