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

8 篇文章 0 订阅
1 篇文章 0 订阅

题目链接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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值