约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。       以上来自百度百科

约瑟夫问题是个很有名的问题:N个人围成一个圈,从第一个人开始报数,第M个人会被杀掉,最后一个人则为幸存者,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。

题目:

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

20分的题最后只拿了17分,共4个测试点,有1个没过,过段时间再回头来找找原因,现附上队友20分的满分解答(要学习她的写代码的简洁明了,

有些可以省去{}的地方就要省去,

尤其要利用好while后()的作用,与答案变量相结合。

其次,要注意判断顺序的问题!!!

#include <bits/stdc++.h>//万能头文件
using namespace std;
int main()
{int n,top = 0,count = 0,s = 0;//top用于标记每轮循环猴子的位置 ,count用于标记报数,s用于记录被淘汰的猴子的个数 int a[1005] ={0};cin >> n;while(s != n-1)//先决条件,即此种做法不用再将N=1的情况单列出来 {top++;if(top > n) top = 1;//先令top自加,若超出位置,说明要进行下一轮循环 if(a[top] == 0) count++;if(count == 3) {a[top] = 1;count = 0;//当循环到3时,说明要再次从1开始报数 s++;}}for(int i = 1;i <= n;i++){if(a[i] == 0) cout << i;}}

然后是17分的答案

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{int N,cnt=0,t,ans;cin >> N;int mark[1005]={0};//mark数组作为标记,未被踢出的标记为0t=1; if(N!=1){for(int i=1;;i++){if(mark[t]!=0){i--;}//若被踢出,直接跳过 if(i%3==0&&mark[t]==0){mark[t]=1;cnt++;}//每当轮到3的倍数,说明该报3了 t++;if (t==N+1){t=1;}//开始新一轮循环 if(cnt==N-1){break;}for(int i=1;i<=N;i++){if(mark[i]==0){ans=i;}}//寻找剩余的那只猴子 }cout<<ans;}else{cout << "1";}//我这种方法要单独讨论1是因为,我是先剔除再判断是否满足cnt==N-1
}

天梯模拟--约瑟夫问题(7-18 猴子选大王 (20 分))相关推荐

  1. 猴子选大王 (20 分)

    7-10 猴子选大王 (20 分) 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧 ...

  2. 7-28 猴子选大王 (20 分)

    猴子选大王 (20 分) 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只 ...

  3. PTA基础题目集 7-28 猴子选大王 (20 分)

    一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不 ...

  4. PTA 7-28 猴子选大王 (20 分)-gcc编译器过不了?

    综述: 猴子选大王这道题看着好像挺简单的,但是实际做起来也不容易.猴子的编号从1到N,然后报数,首先面对的第一个问题是怎么存储这些个猴子,我最开始想用链表,因为链表删除数据容易点,而数组要是删除中间的 ...

  5. 7-28 猴子选大王 (20 分),从中学习约瑟夫环

    一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不 ...

  6. 7-28 猴子选大王 (20 分) 最易理解的方法

    一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不 ...

  7. 中M2019春C入门和进阶练习 7-69 猴子选大王 (20 分)

    一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不 ...

  8. 猴子选大王 java,PAT-JAVA-5-28 猴子选大王 (20分)

    F(1)=0 当有2个人的时候(N=2),报道(M-1)的人自杀,最后自杀的人是谁?应该是在只有一个人时,报数时得到的最后自杀的序号加上M,因为报到M-1的人已经自杀,只剩下2个人,另一个自杀者就是最 ...

  9. 约瑟夫环问题之猴子选大王

    猴子选大王的描述为:n只猴子围成一圈,顺时针方向从1到n编号.之后从1号开始沿顺时针方向让猴子从1,2,...,m依次报数,凡是报到m的猴子,都让其出圈,取消候选资格.然后不停的按顺时针方向报数,让报 ...

最新文章

  1. 关于Advertising Campaign
  2. 004_常用浏览器内核
  3. ora-01017 invalid username/password logon denied
  4. OpenCV实战中:blender-feed(img_warped_s, mask_warped, corners[img_idx]);这里有异常的处理方法
  5. Qt for Android获取手机热点开关状态
  6. java基础学习(一)hashcode
  7. csdn无人驾驶汽车_无人驾驶汽车100年历史
  8. c# 连接各种数据库 Access、Server等
  9. python内置的集成开发工具是什么_python内置的集成开发工具是什么_后端开发
  10. Linux/Windows/MacOS各个操作系统下推荐应用集合
  11. MAC使用homeBrew安装Redis
  12. pytorch 训练face出现的问题
  13. linux 间隔时间中断测试
  14. SQL:pgsql查询geom参考系以及更改geom参考系
  15. Android小项目--2048小游戏,flutter人脸识别插件
  16. idea光标移至行尾快捷键——End键不能移至行尾的解决办法
  17. php的implode函数的作用是,PHP函数implode介绍
  18. focus和onfocus区别
  19. JavaScrpit 犀牛书第七版笔记
  20. NISP一级题库100题

热门文章

  1. 计算机组成原理补码加法证明,补码加减法运算(计算机组成原理).ppt
  2. 问题对语义相似度计算-参赛总结
  3. ClickOnce部署概述
  4. 如何制作超清gif?手机怎么在线制作gif动画?
  5. Python中如何选择Web开发框架?
  6. Python:怎么把一个数组排序后让其他数组对应的排序
  7. Ubuntu系统安装分区设置
  8. 异同点 模拟退火 遗传算法 邻域搜索_智能算法浅介----模拟退火,遗传算法,禁忌搜索,神经网络等...
  9. 河北省计算机应用职称考试,河北省职称计算机应用能力考试.doc
  10. 塑料回收---未来化工行业的新兴增长领域