#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> circle_desk;
int main()
{
while (cin>>n>>m)
{
//初始化操作
circle_desk.clear();
//表示每个人的座位号
for (int i = 0; i <2 * n ; i++) circle_desk.push_back(i);
int flag = 0;//代表最开始指向的位置
//按照顺序将坏人位置删掉 一共有n个坏人循环n次
for (int i = 0; i < n; ++i)
{
flag = (flag + m - 1) % circle_desk.size();
circle_desk.erase(circle_desk.begin() + flag);
}
//剩下的都是好人
flag = 0;
//共2*n个人 打印2*n个字母
for (int i = 0; i <2 * n; i++)
{
//这里注意&&的两个条件位置不能改变 否则vector数组会发生越界
if (flag<circle_desk.size()&&i == circle_desk[flag] )
{
printf("G");
flag++;
}
else
printf("B");
}
printf("\n");
}
return 0;
}
记录刷题第一天:这道题是很经典的约瑟夫问题,大概意思是n个人排成一圈,每次选择固定位距的人去掉 ,首先需要pushback初始化位置,这里我利用了vector数组erase属性的自动缩进属性 ,在每次使得在指针不变的情况下,每次指针都是从正确位置开始计算。