【2005】N只猴子选大王
Time Limit: 3 second
Memory Limit: 2 MB
N只猴子选大王。选举办法如下:从头到尾1、2、3报数,凡报3的退出,余下的从尾到头1、2、3报数,凡报3退出;余下的又从头到尾报数,还是报3的退出;依此类推,当剩下的两只猴子时,取这时报数报1的为王。若想当猴王,请问当初应占据什么位置?
例如:输入猴子最初的只数N:10
输出想当猴王当初应占据的位置:8
Input
输入猴子最初的只数n(n<=200)
第一行输入N的值
Output
输出想当猴王当初应占据的位置
Sample Input
10
Sample Output
8
【题解】
for 3次表示跳3个格子,而每层for中又用一个while以此来跳过那些已经被选过的猴子。在这之前j =1;然后j =n;再试一次。反过来后j没有必要再等于1,因为反过来的时候停在了最前面的猴子位置处。正向的时候要找的也正是这个,就算这个位置已经被占过了,也没有影响。正向找之前先判断一下是不是剩两只,正向找完后再判断是不是只剩两只,只剩两只后可以特判一下,这个特判可以用一个过程来完成,用数字来表示特判的方向(即从前往后扫还是从后忘前扫,扫描到的第一个数字就是答案)
【代码】
#include <cstdio> const int MAXN = 200; int n,po[4],rest;
bool bo[MAXN + 10]; void input_data()
{
scanf("%d",&n);
rest = n;
for (int i = 1;i <= MAXN+9;i++) //初始化
bo[i] = true;
} void output_ans(int l) //这是剩下两个的情况时 特判的方向 也即输出答案。
{
if (l == 1)
{
int j = 1;
while (!bo[j]) j++; //这是跳过已经被选过的猴子的方法
printf("%d",j);
}
else
{
int j = n;
while (!bo[j]) j--; //反向扫描
printf("%d",j);
}
} void get_ans()
{
if (n == 1) //特判只有一只猴子的情况
{
printf("1");
return;
}
int j = 1; //从第一个开始扫描
bool flag = false;
while (!flag)
{
if (rest == 2) //如果只剩两只就输出答案。把这句放前面可以使得程序适用于n=2的情况
{
output_ans(1);
return;
}
while (j <n) //只要j<n就可以继续数 不用等于n 因为等于n只能数一次了。不可能够3次
{
for (int k = 1;k <= 3;k++) //跳过那些被数过的猴子 再数3次。
{
while (!bo[j]) j++; //跳过数过的猴子。
if (j > n) break; //如果超过了n 就表示已经不够数3次了
if (k == 3) //如果数了3次就将当前数到的猴子置为已数过
{
bo[j] = false;
rest--; //减少了一只猴子
}
j++; //继续数下一只
if (j >n) break; //大于n同样不能数了。
}
}
if (rest == 2) //只剩两只的话输出答案。
{
output_ans(2);
return;
}
j = n; //接下来反过来数
while (j > 1) //只要大于1 就可以继续数
{
for (int k = 1;k <= 3;k++)
{
while ( (j >=2) && (!bo[j])) j--; //这是防止数组下标溢出。所以判断条件是>=2
if ( (j == 1) && (!bo[j])) break; //这是不满足的情况 跳出。因为j到了1 而且第一只还已经被数过了
if (k == 3)
{
bo[j] = false;
rest --;
}
j--;//继续往前找
if ( j < 1) break;
}
}
}
} int main()
{
input_data();
get_ans();
return 0;
}
【2005】N只猴子选大王的更多相关文章
- sicily 猴子选大王
题目描述 猴子选大王,有N只猴子,从1-N进行编号.它们按照编号的顺时针方向,排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报1,以后每只猴子报的数字都是它前面猴子所报数字加1.如果一只猴子报的数 ...
- POJ3750: 小孩报数问题+一道经典约瑟夫问题(猴子选大王)
又一次因为一个小错误,POJ上Wrong Answer了无数次..... 在差不多要放弃的时候,发现了这个猥琐的不能再猥琐的bug,改完了提交就AC了,简直无语.... 本题wo采用模拟方法: 1 # ...
- 武汉科技大学ACM:1001: 猴子选大王
Problem Description n只猴子要选大王,选举方法如下:所有猴子按 1,2 ……… n 编号并按照顺序围成一圈,从第 k 个猴子起,由1开始报数,报到m时,该猴子就跳出圈外,下一只猴子 ...
- PHP编程----猴子选大王
<?php/** * 猴子选大王 * 17个猴子围成一圈,从某个开始报数1-2-3-1-2-3---报"3"的猴子就被淘汰, * 游戏一直进行到圈内只剩一只猴子它就是猴大王了 ...
- 猴子选大王 (约瑟夫环)(c#)
猴子选大王问题: 一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1到m的顺序围坐一圈, 从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子, ...
- 猴子选大王的c#实现
原文地址:猴子选大王的c#实现作者:余文 今天被问到了猴子选大王的意思,题目大意就是说有n只猴子围坐成一个圈,按顺时针方向从1到n编号.然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再 ...
- 猴子选大王【PHP】
目录 猴子选大王 指针解决 数组压栈 猴子选大王 一群猴子排成一圈,按1,2,...,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不 ...
- C语言程序设计-猴子选大王[链表应用]
2032 猴子选大王 Description 有N只猴子,从1~N进行编号.它们按照编号的顺时针方向排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报的第一个数字为1,以后每只猴子报的数字都是它们前 ...
- 约瑟夫环问题(猴子选大王)PHP版
约瑟夫斯问题问题有时候也被描述成猴子选大王问题,题目如下.(最后会贴上约瑟夫问题的来历) 一群猴子排成一圈,按1,2,…,n依次编号. 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再 ...
随机推荐
- 【hdu 6038】Function
[Link]:http://codeforces.com/contest/834/problem/C [Description] 给你两个排列a和b; a排列的长度为n,b排列的长度为m; a∈[0. ...
- cocos2d-x-lua基础系列教程六(lua-table增删改查)
lua-table库 1.插入 table.insert () --假设没有设定位置.默认last位置 样例: myTable = { 1, 2, 3 } myTable.insert(myTable ...
- [AngularFire] Resolve snapshotChanges doesn't emit value when data is empty
Updated to AngularFire2 v5.0. One important change is that you need to call .snapshotChanges() or .v ...
- Python笔记---错误笔记
Python---错误笔记 1. Python编码问题: 我们在编写 Python 脚本时,往往会写上中文凝视. 可是有时候,当我们执行程序时.却发现例如以下错误:SyntaxError: Non-A ...
- 内网使用 IPV6 之Teredo篇
这篇转载自 http://bbs.pcbeta.com/viewthread-1580771-1-1.html 上IPv6站点之Teredo篇http://bbs.pcbeta.com/viewthr ...
- js配合My97datepicker给日期添加天数
<input name="ctl00$ContentPlaceHolder1$txtTimeStart" type="text" value=" ...
- Windows上安装多个MySQL实例(转)
在学习和开发过程中有时候会用到多个MySQL数据库,比如Master-Slave集群.分库分表,开发阶段在一台机器上安装多个MySQL实例就显得方便不少. 在 MySQL教程-基础篇-1.1-Wind ...
- js无缝滚动原理及详解[转自刹那芳华]
刚刚接触JS,网上找了一些关于无缝滚动的教程,但都大同小异,对我这种新手来说也只是会用,不知道什么意思,想要自己写个更是一头雾水.于是找了一些资料,详细说明一下JS无缝滚动的原理,相信看过这篇文章之后 ...
- Python 极简教程(十三)while 循环
循环简单来说就是让一段代码按你想要的方式多次运行.软件拥有强大的运算能力,就是由循环提供的. 在 Python 中支持的循环由两种:while 循环 和for 循环. 现在我们先来讲while循环. ...
- Mongodb总结5-通过装饰模式,用Mongodb解决Hbase的不稳定问题
最近继续学习Mongodb的根本原因,是为了解决今天的问题.项目中用到了Hbase,生产环境服务器用了3台,但是不够稳定,每2天左右,就连不上了.重启就好了,当然,这是一个历史遗留问题.我在想,是不是 ...