POJ3750_小孩报数问题【约瑟夫环】【string】【list】

小孩报数问题

Time Limit: 1000MS
Memory Limit: 65536K

Total Submissions: 10309
Accepted: 4783

Description

有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。

Input

第一行输入小孩的人数N(N<=64)

接下来每行输入一个小孩的名字(人名不超过15个字符)

最后一行输入W,S (W < N),用逗号","间隔

Output

按人名输出小孩按顺序出列的顺序,每行输出一个人名

Sample Input

5

Xiaoming

Xiaohua

Xiaowang

Zhangsan

Lisi

2,3

Sample Output

Zhangsan

Xiaohua

Xiaoming

Xiaowang

Lisi

Source

题目大意:题意很明确,就是约瑟夫环。不过从第W个位置开始计数1,数S个

位置,然后出环,输出。

思路:用STL里边的string存放小孩的名字。用list双向链表模拟约瑟夫环。

注意:

string里边clear();用来清除所有字符。

list里push_back(i);用来将编号i放入list

begin();指向第一个元素的位置

end();指向最后一个元素后边的位置

list<int>::iterator it;迭代器用来指向报数编号。

find(first,last,value);用来在区间[first,last)之间找到值等于value的位置

erase(it);用来删除迭代器it指向的元素

*it 表示迭代器it指向的元素值

#include<iostream>
#include<algorithm>
#include<string>
#include<list>
using namespace std;

string child[100];
list<int> v;
int main()
{
    int N,W,S;
    while(cin >> N)
    {
        v.clear();
        for(int i = 1; i <= N; ++i)
            child[i].clear();
        char c;
        for(int i = 1; i <= N; ++i)
            cin >> child[i];
        cin >> W >> c >> S;
        for(int i = 1; i <= N; ++i)
            v.push_back(i);
        list<int>::iterator it;
        it = find(v.begin(),v.end(),W);
        while(v.size() > 0)
        {
            for(int i = 1; i < S; i++)
            {
                ++it;
                if(it == v.end())
                    it = v.begin();
            }
            cout << child[*it] << endl;
            it = v.erase(it);
            if(it == v.end())
                it == v.begin();
        }
    }

    return 0;
}
时间: 2024-10-21 23:11:40

POJ3750_小孩报数问题【约瑟夫环】【string】【list】的相关文章

poj 3750 小孩报数问题 (约瑟夫问题)

小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9883   Accepted: 4597 Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序. Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩

poj3750-小孩报数问题(约瑟夫环)

一,题意: 中文题.二,思路: 1,输入. 2,无限循环1~n~1~n,直到输出n次,再跳出. 3,输出名字,并标记. 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int main() { 5 char name[56][16]; 6 int n, w, s; 7 cin >> n; 8 for (int i = 1; i <= n; i++) { 9 cin >>

约瑟夫环 poj 3750 小孩报数问题 模拟

Language: Default 小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10071   Accepted: 4702 Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序. Input 第一行输入小孩的人数N

约瑟夫问题 小孩报数问题poj3750

小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15228   Accepted: 6778 Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序. Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小

POJ 3750,小孩报数问题,模拟约瑟夫问题

小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9978   Accepted: 4649 Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序. Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 void main() { int a[81],n,i,counter,num; //counter用来计算,num用来记录退出的人数 printf("please input total the number of person:"); scanf("%d",&n); for(i=0;i<n;i++) //为每个人编号,1~n { a[i]=

POJ 3750 小孩报数问题 (线性表思想 约瑟夫问题 数组模拟运算的 没用循环链表,控制好下标的指向就很容易了)

小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10423   Accepted: 4824 Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序. Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小

小孩报数问题(循环链表)_约瑟夫

小孩报数问题(循环链表) TimeLimit:1000MS  MemoryLimit:65536K 64-bit integer IO format:%lld Problem Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序. Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名

1139 约瑟夫环问题

1139 约瑟夫环问题 时间限制:500MS  内存限制:65536K提交次数:157 通过次数:79 题型: 编程题   语言: G++;GCC Description 约瑟夫(josephus)环是这样的:假设有n个小孩围坐成一个圆圈,并从1开始依次给每个小孩编上号码.老师指定从第s位小孩起从1开始报数,当数到m时,对应的小孩出列,依次重复,问最后留下的小孩是第几个小孩?例如:总共有6个小孩,围成一圈,从第一个小孩开始,每次数2个小孩,则游戏情况如下: 小孩序号:1,2,3,4,5,6 离开