基本上纯Joseph核心问题,只是第一步多一件。m。

然后你就可以用获得的递推公式:

Win(n) 代表n当个人的中奖号码,

然后,Win(n)必须相等Win(n-1)。当一个人将在下一次删除队列。

下一个出队列的人是谁呢? 假设模是mod的话,那么下一个出队号码计算为:

Lose(n) = mod % n;

if (Lose(n) == 0) Lose(n) = n;

这样得到公式:

Win(n) - Lose(n)  = Win(n-1);

Win(n) = Win(n-1) + Lose(n);

可是注意人数仅仅有n个了,所以要取模:

Win(n) = (Win(n-1) + Lose(n)) % n;

if (Win(n) == 0) Win(n) = n;

然后由于最后要剩下一个人。那么最后一个人为Win(1) = 1;

可是假设写一般的递归公式。那么就会导致栈溢出的,所以要逆过来,从仅仅有1个人的时候推起,推到第n

这样够清晰了吧,这你都不明确我就没办法了。

作者:靖心 http://blog.csdn.net/kenden23/article/details/30050425

最后得到AC代码:

#include <cstdio>
int main()
{
int n, k, m;
while (scanf("%d %d %d", &n, &k, &m) && m)
{
int winN_1 = 1, winN = 0;
for (int i = 2; i < n; i++)
{
int t = k % i;
if (t == 0) t = k; winN = (winN_1 + t) % i;
if (winN == 0) winN = i; winN_1 = winN;
}
int t = m % n;
if (t == 0) t = m; winN = (winN_1 + t) % n;
if (winN == 0) winN = n; printf("%d\n", winN);
}
return 0;
}

当然我们能够简化上面程序。思路是一样的,只是依据模的特性简化一下罢了:

网上通常是以下这种程序,只是他们的推导。我个人认为较难懂,所以有上面我自己的推导和程序。

我的推导是把这种模简化隔离出来,我个人认为会清晰非常多。

所以假设你看了网上类似的以下程序,认为糊里糊涂的话。建议能够參考我上面的程序。

#include <cstdio>
int main()
{
int n,k,m;
while(scanf("%d%d%d",&n,&k,&m) && n)
{
int winN = 0, winN_1 = 0;
for(int i = 2; i < n; i++)
{
winN = (winN_1 + k) % i;
winN_1 = winN;
}
winN = (winN_1 + m)%n;
printf("%d\n", winN+1);
}
return 0;
}

版权声明:笔者靖心脏。景空间地址:http://blog.csdn.net/kenden23/,只有经过作者同意转载。

Poj 3517 And Then There Was One Joseph核心问题的更多相关文章

  1. UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)

    UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There W ...

  2. poj 3517

    题目链接  http://poj.org/problem?id=3517 题意        约瑟夫环  要求最后删掉的那个人是谁: 方法        理解递推公式就行了  考虑这样一组数据  k ...

  3. POJ 3517 And Then There Was One( 约瑟夫环模板 )

    链接:传送门 题意:典型约瑟夫环问题 约瑟夫环模板题:n个人( 编号 1-n )在一个圆上,先去掉第m个人,然后从m+1开始报1,报到k的人退出,剩下的人继续从1开始报数,求最后剩的人编号 /**** ...

  4. poj 3517 约瑟夫环

    最简单的约瑟夫环,虽然感觉永远不会考约瑟夫环,但数学正好刷到这部分,跳过去的话很难过 直接粘别人分析了 约瑟夫问题: 用数学方法解的时候需要注意应当从0开始编号,因为取余会等到0解. 实质是一个递推, ...

  5. Poj 3517 And Then There Was One(约瑟夫环变形)

    简单说一下约瑟夫环:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个 ...

  6. poj 3517(约瑟夫环问题)

    And Then There Was One Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4873   Accepted: ...

  7. poj 1012 &amp; hdu 1443 Joseph(约瑟夫环变形)

    题目链接: POJ  1012: id=1012">http://poj.org/problem?id=1012 HDU 1443: pid=1443">http:// ...

  8. POJ 1012 Joseph 约瑟夫问题

    http://poj.org/problem?id=1012 早上去图书馆复习苦逼的复习....万恶的数逻.T T我还要自我安慰的说复习完了奖励回来刷水题~ 10点多的时候外面校运会大吼撑杆跳的那个. ...

  9. POJ 1012 Joseph

    Joseph Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44650   Accepted: 16837 Descript ...

随机推荐

  1. jvisualvm远程监控Tomcat

    网上已经有很多这方面的资料,但有些很杂乱,这里做了整理总结. 一.Java VisualVM 概述 对于使用命令行远程监控jvm 太麻烦 . 在jdk1.6 中 Oracle 提供了一个新的可视化的. ...

  2. 【原创】纯OO:从设计到编码写一个FlappyBird (五)

    第四部分请点这里 本文将实现DrawBoard. 如前文所述,Obstacle类和Bing类仅仅提供给DrawBoard必要的信息,如何绘制则完全委托给了DrawBoard,也就是说游戏关键类的细节和 ...

  3. html5移动开发--js温馨提示

    1.a标签执行js笔试 <a id="myID" href="javascript:myfuction();"></a> 2.实时监听i ...

  4. 水声通信(传声)于iOS、Android在情景-depth分析(包括一些声通信源)

    最近的水声通信非常热,特别是,非常嵌入式设备备受瞩目使用,前段时间公布了声通信部分源代码(iOS和Android版本号.下载源的最新版本:点击打开链接 http://download.csdn.net ...

  5. NOI 评价体系 arbiter 安装方法 常见的问题 移植

    #!/bin/bash AppPath="$PWD"   读取当前文件夹 echo "Arbiter is installing..." sudo apt-ge ...

  6. Heibernate 入门笔记(一)---第一个demo

    最近在学heibernate,是看马士兵老师的视频学的,在这里总结一下,做点笔记.关于heibernate的优点,大家可以在网上 百度,这里不做赘述,直接讲怎么使用heibernate 步骤一:新建项 ...

  7. HDU 4778 内存搜索&amp;如压力

    鉴于G宝石,B包.和S.S当代表凑齐每种颜色的宝石S我们可以成为哲学家的石头 每个软件包包含N宝石.分别c1,c2....... 然后他们轮流拿包.每个包可以得到一次.宝石出包放在地上. 假设你可以成 ...

  8. Android源代码学习之六——ActivityManager框架解析

    ActivityManager在操作系统中有关键的数据,本文利用操作系统源代码,逐步理清ActivityManager的框架,并从静态类结构图和动态序列图两个角度分别进行剖析,从而帮助开发者加强对系统 ...

  9. B/S VS C/S

    从软件project的学习到如今的机房合作,我们一直在学习C/S,进入牛腩才正式进入了对B/S的了解,确切点牛腩则是对此的一个过渡,起到了承上启下的作用!看牛腩,事实上最大的感受就是他不止要设计到页面 ...

  10. JAVA对数据库进行操作,实现数据库中数据的插入,查询,更改,删除操作

    (—)通过mysql workbench 创建一个数据库,在这里命名为company,然后建一个tb_employee表 (二)以下是java代码对表tb_employee的操作 1 创建一个Empl ...