POJ3750:: 小孩报数问题(约瑟夫问题)

又一次因为一个小错误,POJ上Wrong Answer了无数次。。。。。

在差不多要放弃的时候,发现了这个猥琐的不能再猥琐的bug,改完了提交就AC了,简直无语。。。。

本题wo采用模拟方法:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 struct child{
 6     char name[16];
 7     int id;
 8     //child(string, int);
 9 }cd[100];
10 void init(int n){
11     char s[16];
12     for(int i=1;i<=n;i++){
13         scanf("%s",cd[i].name);
14         cd[i].id=0;
15     }
16 }
17 int main(){
18     int n,w,s; char c;
19     scanf("%d",&n);
20     init(n);
21     scanf("%d%c%d",&w,&c,&s);
22     cd[w].id=1;
23     int pt=w;
24     int kill=0;
25     while(true){
26         int step=s%(n-kill)-1;
27         if(step<=0) step=step+n-kill;
28         /*
29             这里的取模运算是考虑到s值可能非常大,如果这样的话,模拟报数过程1。。。。s将会非常
30             耗时间。
31             至于为什么这么取模,自己算一算就明白了。
32         */
33         for(int i=1;i<=step;i++){
34                 int ptr=pt%n+1;
35                 while(cd[ptr].id==-1){//要跳过已经被kill的元素
36                     ptr=ptr%n+1;
37                 }
38                 cd[ptr].id=cd[pt].id+1;
39                 pt=ptr;
40         }//这里的pt指向的就是我们要删除的元素
41         cd[pt].id=-1;//将id赋值为-1,相当于删除动作
42         printf("%s\n",cd[pt].name);
43         kill++;
44         if(kill==n) break; //已经清空,跳出循环
45         int ptr=pt%n+1;
46         while(cd[ptr].id==-1){
47                     ptr=ptr%n+1;
48         }
49         cd[ptr].id=1;
50         pt=ptr;
51
52     }
53     //system("pause");
54     return 0;
55 }

时间: 2024-12-28 11:01:10

POJ3750:: 小孩报数问题(约瑟夫问题)的相关文章

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

小孩报数问题 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) 接下来每行输入一个小孩

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

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

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

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

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) 接下来每行输入一个小孩的名字

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

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

poj 3750 小孩报数问题

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

POJ 3750 小孩报数问题 数据结构水

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