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 ... 
随机推荐
- #include<> 和 #include""的区别
			#include< file >编译程序会先到标准函数库中找文件 #include”file” 编译程序会先从当前目录中找文件 参考原文 转: 在C程序中包含文件有以下两种方法: (1)用 ... 
- soapUI系列之—-06 testrunner实现自动化测试
			TestRunner为soapUI自带------testrunner.bat/testrunner.sh 实现步骤: 1. 使用soapUI,针对接口文件创建测试用例. 2. 将测试用例保存至本地, ... 
- 【转】LoadRunner监控 -- Linux的17个指标
			这17个指标根据需要设置,指标设置的越多,对服务器真实值影响越大,所以要秉承按需而设的原则. 1.Average load:Average number of processes simultan ... 
- Android中View窗口getWidth和getMeasuredWidth的差别
			今天在研究自己定义listview的下拉刷新的效果.想移植到项目需求中,再看自己定义源代码时发现了一个问题就是getWidth和getMeasuredWidth两个方法有什么差别,求教万能的百度,经调 ... 
- 杭电 1150 moving tables
			http://acm.hdu.edu.cn/showproblem.php? pid=1050 Moving Tables Time Limit: 2000/1000 MS (Java/Others) ... 
- Windows的MAX_PATH
			MAX_PATH的解释: 文件名最长256(ANSI),加上盘符(X:\)3字节,259字节,再加上结束符1字节,共260http://msdn.microsoft.com/en-us/library ... 
- nextLine() 、nextInt()的跳过问题
			nextInt() 将输入的信息的下一个标记扫描为 int. nextLine() 此扫描器执行当前行,并返回跳过的输入信息. nextInt 会读取下面输入的 int类型的信息以回车作为结束,如果 ... 
- Get started with Sourcetree
			Understand the interface Bookmarks window From that window, select the Local or Remote buttons to vi ... 
- html5--js函数在canvas中的应用
			html5--js函数在canvas中的应用 总结: 1.script中的函数写了要调用 2.rgb()这样的模式的色彩比较适合做变量 3.body的onload事件 4.带参函数 效果: 代码: & ... 
- hihocoder  第二十五周 spfa 最短路
			其实hihocoder里的题目目前大都是模板题啊-.- 这周的是SPFA,暑假的时候有看过SPFA,不过一直用的都是Dijkstra,感觉spfa要更加简洁一点~~,今天找了一份之前一直都看不太懂所以 ... 
