HDU - 4841: 圆桌问题(vector模拟、字符串模拟)

题目链接:HDU - 4841: 圆桌问题

题意:中文题目,意思应该很清楚,就不啰嗦了

思路:可以用vector模拟,当然也可以直接用字符串模拟,初始化全部为好人,按照规则模拟将指定未指定的好人变成坏人,当只剩下n个人时,模拟结束,输出序列;
注意最后输出的回车符,还有50个字母一行输出。

AC代码:

  • 字符串模拟
#include
#include
#include
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
#include
#include
#include
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次
        {
            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;
}

你可能感兴趣的:(vj,stl,模拟)