题目描述:
圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。
样例输入:
2 3
2 4
样例输出:
GBBG
BGGB
i: 循环链表模拟
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node
{
int index;
node *next;
};
map<int,bool>e;
typedef node* List;
void solve()
{
e.clear();
List L;
L->index=0;
L->next=L;
List t=L;
List p;
for(int i=1;i<=2*n;i++)
{
p=new node;
p->next=t->next;
t->next=p;
p->index=t->index+1;
t=p;
}
t->next=t->next->next;
List s=L;
for(int i=1;i<=n;i++)
{
int k=m-1;
while(k--)
{
s=s->next;
}
e[s->next->index]=1;
s->next=s->next->next;
}
}
int main()
{
while(cin>>n>>m)
{
solve();
for(int i=1;i<=n*2;i++)
{
if(e[i])
cout<<"B";
else
cout<<"G";
if(i%50==0 && i!=n*2)
cout<<endl;
}
cout<<endl<<endl;
}
return 0;
}
ii: 通过计算每次出列的位置pos,进行分类,其中pos=(pos+m-1)%size
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m;
void solve()
{
vector<int>a;
for(int i=1;i<=n*2;i++)
{
a.push_back(i);
}
int pos=0;
for(int i=1;i<=n;i++)
{
pos=(pos+m-1)%a.size();
a.erase(a.begin()+pos);
}
int j=0;
for(int i=1;i<=2*n;i++)
{
if(a[j]==i)
{
j++;
cout<<"G";
}
else
cout<<"B";
if(i%50==0 && i!=n*2)
cout<<endl;
}
}
int main()
{
while(cin>>n>>m)
solve();
}