题目链接:HDU - 4841: 圆桌问题
题意:中文题目,意思应该很清楚,就不啰嗦了
思路:可以用vector模拟,当然也可以直接用字符串模拟,初始化全部为好人,按照规则模拟将指定未指定的好人变成坏人,当只剩下n个人时,模拟结束,输出序列;
注意最后输出的回车符,还有50个字母一行输出。
AC代码:
- 字符串模拟
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
int table[maxn];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(table,0,sizeof(table));
for(int i=0,j=0,k=n; k; i++)
{
if(i==2*n) i=0;//到了一圈再从头开始数
if(table[i]==0) j++;//一步一步走
if(j==m)
{
table[i]=1;//标记坏人
j=0;
k--;
}
}
for(int i=0; i<2*n; i++)
{
if(!(i%50) && i) printf("\n");//50个字母一行
if(table[i]) printf("B");
else printf("G");
}
printf("\n\n");//每组数之后还要输出一个空行
}
return 0;
}
- vector模拟
///vector模拟
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
vector<int>v;
int vis[maxn];//标记访问过的点
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(vis,0,sizeof(vis));
v.clear();
for(int i=0; i<2*n; i++)
v.push_back(i);//初始化
for(int i=0,pos=0,num=2*n; i<n; i++)//循环n次
{
pos=(pos+m-1)%(num--);//考虑圆桌是个环,故要作次取余处理,且每处理一次环的长度减一
vis[v[pos]]=1;
v.erase(v.begin()+pos);//删除pos位置上的数
}
for(int i=0; i<2*n; i++)
{
if(!(i%50) && i) printf("\n");//50个字母一行
if(vis[i]) printf("B");
else printf("G");
}
printf("\n\n");//每组数之后还要输出一个空行
}
return 0;
}