Poj 3517 And Then There Was One Joseph核心问题
基本上纯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核心问题的更多相关文章
- 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 ...
- poj 3517
题目链接 http://poj.org/problem?id=3517 题意 约瑟夫环 要求最后删掉的那个人是谁: 方法 理解递推公式就行了 考虑这样一组数据 k ...
- POJ 3517 And Then There Was One( 约瑟夫环模板 )
链接:传送门 题意:典型约瑟夫环问题 约瑟夫环模板题:n个人( 编号 1-n )在一个圆上,先去掉第m个人,然后从m+1开始报1,报到k的人退出,剩下的人继续从1开始报数,求最后剩的人编号 /**** ...
- poj 3517 约瑟夫环
最简单的约瑟夫环,虽然感觉永远不会考约瑟夫环,但数学正好刷到这部分,跳过去的话很难过 直接粘别人分析了 约瑟夫问题: 用数学方法解的时候需要注意应当从0开始编号,因为取余会等到0解. 实质是一个递推, ...
- Poj 3517 And Then There Was One(约瑟夫环变形)
简单说一下约瑟夫环:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个 ...
- poj 3517(约瑟夫环问题)
And Then There Was One Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4873 Accepted: ...
- poj 1012 & hdu 1443 Joseph(约瑟夫环变形)
题目链接: POJ 1012: id=1012">http://poj.org/problem?id=1012 HDU 1443: pid=1443">http:// ...
- POJ 1012 Joseph 约瑟夫问题
http://poj.org/problem?id=1012 早上去图书馆复习苦逼的复习....万恶的数逻.T T我还要自我安慰的说复习完了奖励回来刷水题~ 10点多的时候外面校运会大吼撑杆跳的那个. ...
- POJ 1012 Joseph
Joseph Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44650 Accepted: 16837 Descript ...
随机推荐
- network: Android 网络推断(wifi、3G与其它)
public class NetworkProber { /** * 网络是否可用 * * @param activity * @return */ public static bool ...
- php学习笔记--高级教程--读取文件、创建文件、写入文件
打开文件:fopen:fopen(filename,mode);//fopen("test.txt","r"): 打开模式:r 仅仅读方式打开,将文件指针指向 ...
- maven snapshot和release版本号之间的差
在使用maven过程.我们经常会在不稳定的状态有很多公共图书馆在发展阶段.需要改变在任何时间和公布,你可能有一天一次发布.经验bug时间,甚至一天公布N次要.我们知道,.maven依赖管理是基于管理的 ...
- XML数据读取方式性能比较(一)
原文:XML数据读取方式性能比较(一) 几个月来,疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了.现在已经知道,至少有四种常用人XML数据操作方式(好像Java差不多),不过还没有实际比较 ...
- linux input如何固定设备event handler
于qt开发时间.遇到的问题,usb输入设备(鼠标器,usb 电容屏)在动力分配后自己主动input节点,实例usb鼠标停留电后,分配给自己的主动性/dev/input/event0 mouse0.第一 ...
- 华为OJ:查找字符的第一个字符串只出现一次
您可以使代码有点写得真好,不要直接写双循环,如果,是可能的写函数调用,非常高的可重用性. import java.util.Scanner; public class findOnlyOnceChar ...
- Windows在生产体系Android开关机动画
在Windows根据系统.办Android开关机动画,几个需要注意的问题: 1.压缩的选择 2.压缩的格式: 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- Android View系统解析(上)
- POJ3213(矩阵乘法)
PM3 Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 3036 Accepted: 1059 Description ...
- Chapter06-Phylogenetic Trees Inherited(POJ 2414)(减少国家DP)
Phylogenetic Trees Inherited Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 480 Accepted ...