这题的期望解法应当是循环链表。
但是先写一种简单做法
思路:
这道题目的本质就是模拟。但是难度主要在于删除人之后,人的总数发生了变化,需要进行维护。
可以借助vector来进行维护,vector自带的erase函数能够删除一个元素并把后面的元素自动的往前挪动。
这样子先把一个vector赋值为1,2,3,4,5……
然后进行模拟,剩下2,4,5……(举例子)是好人。
然后1,2,3,4……如果是好人的位置就输出G,否则为B。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
int main()
{
int i, j;
vector<int> a;
int n, m;
cin >> n >> m;
a.clear();
for (i = 0; i < 2 * n; i++)
a.push_back(i);
int p = 0;
for (i = 0; i < n; i++)
{
p = (p + m - 1) % a.size();// 找到这个人的位置
a.erase(a.begin() + p);// 删除
}
j = 0;
for (i = 0; i < 2 * n; i++)
{
if (!(i % 50) && i)///输出的换行
cout << endl;
if (j < a.size() && i == a[j])//如果当前坐标为好人,输出
{
j++;
cout << "G";
}
else
cout << "B";
}
cout << endl
<< endl;
return 0;
}