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 }
还有可以用双向循环链表来模拟:
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: 小孩报数问题+一道经典约瑟夫问题(猴子选大王)的更多相关文章
- 约瑟夫环问题(猴子选大王)PHP版
约瑟夫斯问题问题有时候也被描述成猴子选大王问题,题目如下.(最后会贴上约瑟夫问题的来历) 一群猴子排成一圈,按1,2,…,n依次编号. 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再 ...
- (顺序表应用5.1.1)POJ 3750 小孩报数问题(基本的约瑟夫环问题:给出人数n,出发位置w,间隔数s)
/* * POJ_3750.cpp * * Created on: 2013年10月30日 * Author: Administrator */ #include <iostream> # ...
- java实现猴子选大王问题(约瑟夫问题)
题目:m只猴子围成一圈报数,报n的猴子自动离开,然后下一位重新从1开始报数,一直循环,最后剩下的那个猴子就是猴大王,写出程序求出最后是大王的那只猴子最初的位置. package learn; impo ...
- 算法_php猴子选大王_约瑟夫问题
题目: n个猴子围坐一圈,从第一个猴子开始数,到第m个出列,求最后一个猴子的编号. 分析: 首先想到循环,然后队列,然后堆,所以用数组模拟一个循环的列表,下标为[0-(n-1)],下标+1整除m干掉元 ...
- 猴子选大王 (约瑟夫环)(c#)
猴子选大王问题: 一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1到m的顺序围坐一圈, 从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子, ...
- cdoj525-猴子选大王 (约瑟夫环)
http://acm.uestc.edu.cn/#/problem/show/525 猴子选大王 Time Limit: 3000/1000MS (Java/Others) Memory Li ...
- 约瑟夫问题 小孩报数问题poj3750
小孩报数问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15228 Accepted: 6778 Descripti ...
- POJ 3750 小孩报数问题 (线性表思想 约瑟夫问题 数组模拟运算的 没用循环链表,控制好下标的指向就很容易了)
小孩报数问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10423 Accepted: 4824 Descripti ...
- 解析js中作用域、闭包——从一道经典的面试题开始
如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...
随机推荐
- hdu 1427 dfs
速算24点 题意:随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算 顺序,使得最终 ...
- 【转】iOS 9自带苹果式省电模式 依然软硬兼施
非本人总结,转自:http://news.91.com/apple/1506/21837672.html 说好的改善和优化,iOS 9真的带来了.且不说那些经过改善的功能,iOS 9 推出的低功耗模式 ...
- 一步步学习ASP.NET MVC3 (4)——Razor(2)
请注明转载地址:http://www.cnblogs.com/arhat 在上一章,我们介绍了Razor的一些基本语法,从Razor中我们可以出ASP.NET MVC的视图引擎给我们带来的便利,但是同 ...
- Matlab使用心得
1..*和*的区别 .*只能用于两个同型矩阵相乘,且是相对应的元素做乘法运算,其运算规则和我们线性代数里的乘法规则是不一样的:而*用于两个矩阵相乘,如mxn,nxk两个矩阵相乘,它的运算规则和线性代数 ...
- 十款优秀的在线JavaScript工具介绍
JavaScript是Web开发者不可或缺的一项技能,它可以为你的网站添加丰富的交互功能和绚丽的视觉效果,以此来增强用户体验. 本文整理了10款非常优秀的在线JavaScript代码工具,涵盖编辑.压 ...
- HDU 1098 Ignatius's puzzle
http://acm.hdu.edu.cn/showproblem.php?pid=1098 题意 :输入一个K,让你找一个a,使得f(x)=5*x^13+13*x^5+k*a*x这个f(x)%65等 ...
- loadrunner_analysis技巧_filter和group by
很多时候要对loadrunner的收集结果进行一些选择性的过滤,比如我们使用阶梯式增加用户的方式,在初期vu没有全部准备好的情况下,此时的曲线不能体现实际情况,所以我们可以用 filter这个工具来帮 ...
- loadrunner throughput(吞吐量)理解
转自http://www.51testing.com/html/29/n-110129.html Throughput翻译为吞吐量,按照常规理解网络吞吐量表示在单位时间内通过网卡数据量之和,其中即 ...
- easyui源码翻译1.32---ProgressBar(进度条)
前言 使用$.fn.progressbar.defaults重写默认值对象.下载该插件翻译源码 进度条提供了一个反馈显示一个长时间运行的操作进展.可以更新的进展条,让用户知道当前正在执行操作. 源码 ...
- [unity菜鸟] 修改发布成web后的logo
1. 原始效果 (tip:在4.x的书中有介绍) 2. 打开.html文件原始代码如下 <script type='text/javascript' src='jquery.min.js'&g ...