hdu 4841 圆桌问题 | vector 容器的使用

Posted la-pu-ta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 4841 圆桌问题 | vector 容器的使用相关的知识,希望对你有一定的参考价值。

Problem Description

圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。

Input

多组数据,每组数据输入:好人和坏人的人数n(<=32767)、步长m(<=32767);

Output

对于每一组数据,输出2n个大写字母,‘G’表示好人,‘B’表示坏人,50个字母为一行,不允许出现空白字符。相邻数据间留有一空行。

Sample Input

2 3
2 4

Sample Output

GBBG
BGGB

思路

使用0,1,2,3...2n-1表示这2n个人的编号,并将这2n个人储存在vector中。我们的任务是要找出坏人的编号并将其从vector中去除。确定坏人
编号时,注意由于是圆形桌面,需要求模的运算。

知识点

vector用法

  • 构造
例子 解释
vector a 定义一个名为a的int类型的vector,初始内容为空
vector a(100, "demo") 定义一个名为a的string类型的vector,大小为100,每个值都是"demo"
  • 方法

假设已经建立了一个名为v的vector。

例子 解释
v.front() 返回第一个元素
v.back() 返回最后一个元素
v.empty() 检查是否为空
v.size() 返回vector大小
v.clear() 清空vector
v.push_back(6) 尾部插入一个6
v.insert(v.begin()+i, 6) 在原下标为i的元素前方插入一个6
v.pop_back() 删除尾部元素
v.erase(v.begin() + 2) 删除下标为2的元素
v.clear() 清空vector

代码

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;

vector <int> desk;

int main(){
    int n, m;
    while (~scanf ("%d %d", &n, &m)){
        desk.clear();
        for (int i=0;i<2*n;i++) desk.push_back(i);
        int pos = 0;
        for (int i=0;i<n;i++){
            pos = (pos + m - 1) % desk.size();
            desk.erase(desk.begin() + pos);
        }
        int cnt = 0;
        for (int i=0;i<2*n;i++){
            if (i % 50 == 0 && i != 0) printf("
");
            if(desk[cnt] == i && cnt < desk.size()){
                cnt++;
                printf("G");
            }
            else printf("B");
    }
    printf("

");
    }
    return 0;
}

以上是关于hdu 4841 圆桌问题 | vector 容器的使用的主要内容,如果未能解决你的问题,请参考以下文章

hdu4841_圆桌问题

vector的使用-Hdu 4841

圆桌问题(hdu4841)

hdu4841 圆桌问题

HDU 4841 : 圆桌问题

hdu 4841 用stl::vector解决约瑟夫问题