poj3750 小孩报数问题


小孩报数问题
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8929 Accepted: 4191

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


题意在此就不解说了;而此题就是一个循环链表就可以搞定。这很类似于约瑟夫环的问题,唯一区别就在于本题是针对字符串,而约瑟夫环是对排列的数。



代码:



#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<sstream>
#include<cassert>
using namespace std;
#define LL __int64
struct node {
    char a[20];
    struct node *rear;
    struct node *next;
};

node* create(int n) {
    node *point,*head;
    head = point = new node;
    for(int i=2; i<=n; ++i) {
        point->next=new node;
        point->next->rear=point;
        point=point->next;
    }
    point->next=head;
    head->rear=point;
    return head;
}

node* rmove(node* p,int step) {
    for(int i=1; i<step; ++i) {
        p=p->next;
    }
    return p;
}

node* Delete(node *p) {
    p->rear->next = p->next;
    p->next->rear = p->rear;
    p = p->next;
    return p;
}

int main() {
    int n,w,s;
    scanf("%d",&n);
    node *point,*head;
    head=point=create(n);

    for(int i = 1; i <= n; ++i) {
        scanf("%s",point->a);
        point =point->next;
    }

    // printf("head = %s\n",head->a);
    //printf("point = %s\n",point->a);
    scanf("%d,%d",&w,&s);
    point=rmove(head,w);
    //printf("   %s\n",point->a);
    while(point->next!=point) {
        point=rmove(point,s);
        printf("%s\n",point->a);
        point=Delete(point);
    }
    printf("%s\n",point->a);
    return 0;
}
/*

5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3

*/



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值