poj1781In Danger(约瑟夫) 问题
之前队内赛中的一道题目 当时怎么想也没想到,就一直放到了今天,刚才看另一题的讲解突然看到时拿这个题作为引子来讲的,就仔细看了下。
参考《《具体数学》》 p7。 Josephus问题
开始是讲了一个古老的故事,说J和同伴陷入险境,大家不愿做俘虏,就想了个游戏来进行自杀,每第二个人就要去死。。J觉得这样很傻,并很快的算出了自己该在的位置,逃脱了这无聊的自杀。由此引出了这个有趣的算法。
这本书上讲的很清楚, 我就大体概括一下。
可以先从10个人来看 很明显第一次死掉的是全部的偶数, 然后是 是3 7 1 9.那么J(10) = 5;
可以猜测所有的J(n)都为奇数,因为第一轮就杀掉了全部的偶数,很明显。。
然后再猜J(n) = n/2? 很明显 不是。不过假如有2N个人 第一次还是杀掉所有的偶数 那么剩下了n个数,那么这n个数不就是跟之前的n同样来处理。。,
只不过编号变成了原来的2*i -1. 所以J(20) = 2*j(10)-1 = 9; 类推 J(40) = 17 所以得出j(5*2^m) = 2^(m+1)+1;
那么奇数呢,类似可知 J(2n+1) = 2*J(n)+1;
所以归纳可得
j(1) = 1;
j(2n) = 2j(n)-1;
j(2n+1) = 2j(n)+1;
这样是很快的,每次以减少2倍或多的速度来算,不过这可关乎J的性命,所以J还得想更快的方法才能确保他逃得过此劫。
那么继续看 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 1 3 1 3 5 7 1 3 5 7 9 11 13 15 17 1
下面对的是J(n)的值 ,结论应该可以猜出来了,与2的幂有关。
结论:对于每一个n可以写成n=2^m+k的形式 。那么J(2^m+k) = 2k+1;
上式是由 上上的递归式推出来的,书上用的归纳法,数学不好就不再证了。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 100000
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
int main()
{
int n,m;
char c;
while(cin>>n>>c>>m)
{
if(!n&&!m) break;
n = n*pow(10.0,m);
int k = log(n*1.0)/log(2.0);
int s = pow(2.0,k);
cout<<(n-s)*+<<endl;
}
return ;
}
poj1781In Danger(约瑟夫) 问题的更多相关文章
- ACM数学
1.burnside定理,polya计数法 这个专题我单独写了个小结,大家可以简单参考一下:polya 计数法,burnside定理小结 2.置换,置换的运算 置换的概念还是比较好理解的,< ...
- 约瑟夫问题(java实现)
方法一.自定义的链表实现 package com.code.yuesefu; public class YueSeFuList { public static void main(String[] a ...
- R自动数据收集第一章概述——《List of World Heritage in Danger》
导包 library(stringr) library(XML) library(maps) heritage_parsed <- htmlParse("http://en ...
- Java 解决约瑟夫问题
约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称“丢手绢问题”.) 有这样一个故事,15个教徒和15个非教徒在深海遇险必须讲 ...
- C#实现约瑟夫环问题
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace orde ...
- C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析
尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...
- C语言链表实现约瑟夫环问题
需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...
- AC日记——约瑟夫问题 codevs 1282
1282 约瑟夫问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 有编号从1到N的N个小 ...
- Have Fun with Numbers及循环链表(约瑟夫问题)
1. 循环链表(约瑟夫问题) https://github.com/BodhiXing/Data_Structure 2. Have Fun with Numbers https://pta.pate ...
随机推荐
- libevent API 介绍
基本应用场景也是使用 libevnet 的基本流程,下面来考虑一个最简单的场景,使用livevent 设置定时器,应用程序只需要执行下面几个简单的步骤即可. 1)首先初始化 libevent 库,并保 ...
- fedora下安装xdot和objgraph
前提:安装好了python 1.先下载xdot-0.6.tar.gz和objgraph-1.8.0-py27-none-any.whl,你也可以在官网上下载其他版本. 2.下载完后,解压. 3.打开终 ...
- github的提交源码到服务器
github是现代的代码库,各种牛人,各种开源,也是现在大公司招聘的一个考察点, 这里介绍一下怎样把本地源码提交到github上. 首先我们需要在github上创建一个respository. 2,输 ...
- Koa2学习(四)POST请求
Koa2学习(四)POST请求 接受请求 POST请求的数据实体,会根据数据量的大小进行分包传送. 当node.js后台收到post请求时,会以buffer的形式将数据缓存起来.Koa2中通过ctx. ...
- SQL Server 2012 从备份中还原数据库
1.首先把原数据库备份,检查原数据库的日志文件是否太大,如果过于大应该先收缩数据库日志 2.把备份的数据库文件在目标SQL Server还原,点击数据库,选择“还原文件或文件组” 3.如果需要修改还原 ...
- maven配置篇
1,windows A)安装maven之前,确认已正确安装JDK B)下载maven http://maven.apache.org/download.html C)将压缩包解压到指定目录,E:\ap ...
- hibernate 的缓存机制
这是面试中经常问到的一个问题,楼主可以按照我的思路回答,准你回答得很完美,首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再具体说说Hibernate中缓存的分类情况,最后可以举个具 ...
- I.MX6 wpa_applicant 开启 debug 输出
/*********************************************************************** * I.MX6 wpa_applicant 开启 de ...
- sqlite支持linq
A small library to easily access SQLite databases from .NET/Mono/MonoTouch applications In order to ...
- html/html5中的download属性
兼容性不是很好, 只是了解一下: 主要表现在跨域策略的处理上,Chrome浏览器和FireFox浏览器: 如果需要下载的资源是跨域的,包括跨子域,在Chrome浏览器下,使用download属性是可以 ...