算法刷题记录:NC22227 约瑟夫环

题目链接

https://ac.nowcoder.com/acm/problem/22227

解题思路

模拟环。
这道题顺序数就行,顺序是逆时针,逆时针的箭头是往左拐的,变成直线后趋于正半轴所以是 +
不过,这道模拟环并没有说从idx号开始,往左/右数几个人,所以不需要考虑 +-
因为不会越界,所以也不用额外%n

AC代码

#include <iostream>
#include <vector>

using namespace std;

int n, st, m, i;
vector<int> v;

int main()
{
    while (cin >> n >> st >> m)
    {
        v.clear();
        for (int i = 1; i <= n; ++ i) v.push_back(i);

        int pos = st - 1;
        for (int i = n - 1; i >= 0; -- i)         // 赶走n-1个人,会被淘汰n-1次
        {
            pos = (pos + m - 1) % v.size();       // 每次从第pos个人开始,m-1:下标应当从0开始
            v.erase(pos + v.begin());             // 删除第pos个人
        }
        cout << v[pos] << endl;
    }
}
posted @ 2023-05-23 13:31  想个昵称好难ABCD  阅读(9)  评论(0编辑  收藏  举报