
约瑟夫问题
ConwayTian
一切再来,为时未晚。
毁掉你人生的,其实是你内心的平庸,是你失去追求卓越的那个瞬间。
展开
-
POJ 3517 And Then There Was One 约瑟夫环
无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。 为了讨论方便,先把问题稍微改变一下,并不影响原意: 问题描述:n原创 2012-03-02 18:58:19 · 789 阅读 · 0 评论 -
POJ 3517 And Then There Was One 约瑟夫环
题意:约瑟夫环。题解:直接模拟了···#include#include#includeusing namespace std;struct NODE{ int id; NODE *next, *pre;};NODE node[10009];void build_list ( int n ){ for ( int i = 2; i < n; i原创 2012-02-29 23:40:42 · 865 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies? (线段树模拟约瑟夫环)
题意:n个孩子做约瑟夫的游戏,第p个离开的孩子可以得到F[p]个糖果,问谁得到的糖果最多。其中F[p],表示p的因子的个数。题解:用线段树模拟约瑟夫环。不过用树状数组+二分应该也可以吧。另外貌似可以用“反素数”来剪枝,不过我不会,所以只能预处理下F[p]。#include#include#includeusing namespace std;#define MAX 50000原创 2012-03-03 16:04:43 · 1157 阅读 · 0 评论 -
POJ 2244 Eeny Meeny Moo 约瑟夫
题意:约瑟夫环问题,给定人数n,求一个步长m使得最后剩下的是2.#include#include#include#includeusing namespace std;int num[200];int Josephus ( int n, int m, int s ){ if ( m == 1 ) return ( s + n - 1 ) % n;原创 2012-03-02 19:38:19 · 863 阅读 · 0 评论 -
POJ 1781 In Danger 约瑟夫环(log(m))
#include#include#include#includeusing namespace std;//编号从0,1,2,···n-1//n为人数,m为出圈步长,s为起使报数位置(起始位置不一定要出圈)int Josephus ( int n, int m, int s ){ if ( m == 1 ) return ( s + n - 1 ) % n原创 2012-03-02 19:00:25 · 840 阅读 · 0 评论 -
POJ 1012 Joseph 约瑟夫-保证坏人先被清除
题意:同样的约瑟夫问题,只是现在有K个好人,K个坏人,确定一个步长,是的在第一个好人被清除之前所有坏人都被清除干净。题解:1.坏人被清除掉的先后顺序无关紧要,知道下一个除掉的是好人还是坏人就行了。2.由于好人一直都是k个,每除掉一个坏人,坏人数-1,所以队列的总数每次-1但是好人一直是前k个3.下一个被清除的人在队列中的“相对”序号为 s = (s+m-1)%rest4.只要s>原创 2012-03-02 18:52:29 · 4979 阅读 · 1 评论