我在圆圈死亡游戏问题上的方法有什么问题?

What's wrong in my approach in a problem of game of death in a circle?

#include<bits/stdc++.h>
#include<vector>
#include<algorithm>
using namespace std;
void safe(int n,int k,int a[])
{
    vector<int>s(a+0,a+n);
    vector<int>b(a+0,a+n);
    while(s.size()>1)
    {
        int r;
        r=s.size();
       int count=1;
        while(count<=r)
        {
            b[count%r]=0;
            count=count+k;
        }
    b.erase(remove(b.begin(),b.end(),0),b.end());
    s=b;    
    }
    
    for(int x:s)
    {
        cout<<x<<"\n";
    }
}


int main()
{
    int t;
    cin>>t;
    for(int i=0;i<t;i++)
    {
        int n,k;
        cin>>n>>k;
        int *a=new int[n];
        for(int j=1;j<=n;j++)
        {
            a[j-1]=j;
        }
        if(n>2)
        {
        safe(n,k,a);
        }
        else if(n==2)
        {
     cout<<a[1]<<"\n";
        }
        else
        cout<<a[0]<<"\n";
    }
}

输入:

4
4 2
5 2
2 1
50 10

输出:

1
3
2
19  --> it should be 36 

如果你不知道这个问题 问题描述: 有n个人围成一圈(顺时针编号为1到n)等候处决。计数从圆圈中的点 1 开始,并沿固定方向(顺时针)绕圆圈进行。在每一步中,都会跳过一定数量的人并执行下一个人。淘汰围绕圆圈进行(随着被处决的人被移除,圆圈变得越来越小),直到只剩下最后一个人,他被赋予了自由。 给定总人数 n 和一个数字 k,这表示 k-1 人被跳过,第 k 人被循环杀死。任务是在最初的圈子中选择一个位置,这样你就是最后一个剩下的人,从而生存下来。 考虑如果 n = 5 且 k = 2,则安全位置为 3。 先杀2号位的人,再杀4号位的人,再杀1号位的人。最后,5号位的人被杀。所以位置3的人活下来了

这是一个可能的解决方案,希望评论能说明问题。不需要分配一个 int[] 并将其复制到 vector 中,您可以直接使用 iota 初始化 vector。同样,您可以随时删除元素,而不是在稍后的步骤中进行清零和删除。

#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

using namespace std;
void safe(int n, int k) {
  vector<int> s(n);
  // Init the vector 1..n
  iota(s.begin(), s.end(), 1);
  int i = 0;
  // While more than one survive...
  while (s.size() > 1) {
    // Skip forward (k-1)
    i = (i + k - 1) % s.size();
    // Kill the next one
    s.erase(s.begin() + i);
  }
  for (int x : s) {
    cout << x << "\n";
  }
}

int main() {
  int t;
  cin >> t;
  for (int i = 0; i < t; i++) {
    int n, k;
    cin >> n >> k;
    if (n > 2) {
      safe(n, k);
    } else if (n == 2) {
      cout << 2 << "\n";
    } else
      cout << 1 << "\n";
  }
}