又一次因为一个小错误,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 }

还有可以用双向循环链表来模拟:

 1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 using namespace std;
5 struct node{
6 int id;
7 node *next,*pre;
8 node();
9 node(int);
10 };
11 node *head;
12 char name[101][20];
13 node::node(int value){
14 id=value;
15 next=pre=NULL;
16 }
17 void build(int n){
18 head=new node(1);
19 head->next=head->pre=head;
20 if(n==1) return;
21 node *p=head;
22 for(int i=2;i<=n;i++){
23 node *a=new node(i);
24 p->next=a;
25 a->pre=p;
26 p=a;
27 }
28 p->next=head;
29 head->pre=p;
30 }
31 void print(){
32 node *p=head;
33 printf("%d ",p->id);
34 p=p->next;
35 while(p!=head){
36 printf("%d ",p->id);
37 p=p->next;
38 }
39 printf("\n");
40 }
41 void joseph(int s,int k){
42 node *p=head;
43 s--;
44 while(s--) p=p->next;
45 while(p->next!=p){
46 for(int i=1;i<=k-1;i++) p=p->next;
47 printf("%s\n",name[p->id]);
48 node *front=p->pre;
49 node *rear=p->next;
50 p=rear;
51 front->next=rear;
52 rear->pre=front;
53 }
54 printf("%s\n",name[p->id]);
55 }
56 int main(){
57 int n; char c;
58 scanf("%d",&n);
59 build(n);
60 //print();
61 for(int i=1;i<=n;i++){
62 scanf("%s",name[i]);
63 }
64 int s,k;
65 scanf("%d%c%d",&s,&c,&k);
66 joseph(s,k);
67 }

猴子选大王问题: 

题目描述约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

输入每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:

0 0

输出对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
样例输入

6 2
12 4
8 3
0 0

样例输出

5
1

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

 

 

POJ3750: 小孩报数问题+一道经典约瑟夫问题(猴子选大王)的更多相关文章

  1. 约瑟夫环问题(猴子选大王)PHP版

    约瑟夫斯问题问题有时候也被描述成猴子选大王问题,题目如下.(最后会贴上约瑟夫问题的来历) 一群猴子排成一圈,按1,2,…,n依次编号. 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再 ...

  2. (顺序表应用5.1.1)POJ 3750 小孩报数问题(基本的约瑟夫环问题:给出人数n,出发位置w,间隔数s)

    /* * POJ_3750.cpp * * Created on: 2013年10月30日 * Author: Administrator */ #include <iostream> # ...

  3. java实现猴子选大王问题(约瑟夫问题)

    题目:m只猴子围成一圈报数,报n的猴子自动离开,然后下一位重新从1开始报数,一直循环,最后剩下的那个猴子就是猴大王,写出程序求出最后是大王的那只猴子最初的位置. package learn; impo ...

  4. 算法_php猴子选大王_约瑟夫问题

    题目: n个猴子围坐一圈,从第一个猴子开始数,到第m个出列,求最后一个猴子的编号. 分析: 首先想到循环,然后队列,然后堆,所以用数组模拟一个循环的列表,下标为[0-(n-1)],下标+1整除m干掉元 ...

  5. 猴子选大王 (约瑟夫环)(c#)

    猴子选大王问题: 一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1到m的顺序围坐一圈, 从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子, ...

  6. cdoj525-猴子选大王 (约瑟夫环)

    http://acm.uestc.edu.cn/#/problem/show/525 猴子选大王 Time Limit: 3000/1000MS (Java/Others)     Memory Li ...

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

    小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15228   Accepted: 6778 Descripti ...

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

    小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10423   Accepted: 4824 Descripti ...

  9. 解析js中作用域、闭包——从一道经典的面试题开始

    如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...

随机推荐

  1. hdu 2191 珍惜现在,感恩生活 多重背包入门题

    背包九讲下载CSDN 背包九讲内容 多重背包: hdu 2191 珍惜现在,感恩生活 多重背包入门题 使用将多重背包转化为完全背包与01背包求解: 对于w*num>= V这时就是完全背包,完全背 ...

  2. Linux下STM32开发环境的搭建

    目录 一.概述 1.目的 2.开发环境描述 3.Eclipse构建的STM32集成开发环境结构 4.GDB / GDB Server 调试模型 二.搭建步骤 三.详细的搭建过程 1.安装eclipse ...

  3. 《javascript高级程序设计》对象图

    1.原型链图 2.作用域链图 3.继承

  4. ul 、ol li 继承原有样式的问题

    如: 1.为什么我的服务器无法远程了? 2.为什么我的服务器总是自动重启? 3.为什么我的服务器总是自动重启? 以前写这种类型的列表,都是自己用键盘输入这些数字,其实不然,ul .ol li本身就自带 ...

  5. web前端开发分享-css,js进阶篇

    一,css进阶篇: 等css哪些事儿看了两三遍之后,需要对看过的知识综合应用,这时候需要大量的实践 经验, 简单的想法:把qq首页全屏另存为jpg然后通过ps工具切图结合css转换成html,有无 从 ...

  6. [转载]Asp.net MVC2 与 MVC3 路由调试好帮手RouteDebug 与 RouteDebugger

    RouteDebug 与 RouteDebugger是什么? 在Asp.Net MVC程序中,路由(Route)是一个非常核心的概念,可以说是MVC程序的入口,因为每一个Http请求都要经过路由计算, ...

  7. 严重: The web application [] registered the JDBC driver 错误

    近日发现启动tomcat的时候报如下警告: -- :: org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 严重: The ...

  8. [杂题]CSUOJ1413 Area of a Fractal

    题目链接 题意:题中给了图,所以不看字大概也知道  求的是第n个图形的面积. 就是找规律 递推 一类的... 先给结论: 很鬼畜的公式:    $\displaystyle\frac{3\times ...

  9. edX开发部署开篇

    edX介绍请参照百度百科 简单的讲,edX是麻省理工和哈佛大学联手创建的开源在线教育平台,任何人都可以在AGPL协议下获取它的源代码,并使用它. 本文的宗旨就是记录安装.使用.开发.维护edX的点点滴 ...

  10. Android USB Host 与 HID 之通讯方法

    Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两个方法,要实现真正的通 ...