随笔分类 -  约瑟夫环

摘要:题意:模拟约瑟夫环。有N(1<=N<=500000)个孩子,从第K(1<=K<=N)个开始。接下来N行中,每行有这个孩子的名字和数字pos(绝对值小于10^8,表示接下来第N个孩子出局),第P个出局的孩子会得到F(P)的糖果的数目。F(P)定义为:P的因子的数目。这题我们用线段树来模拟约瑟夫循环:这题的关键是两个公式,如果从当前的k位置和pos推出下一个孩子的k(其中k表示在当前状态下第几个,pos表示在数组中的下标。)如果num>0。k=(k-1+node[pos].num)%n+1。。但是之前这个位置的那个人已经被删除,现在的k-1表示是的原来的那个孩子的下一 阅读全文
posted @ 2012-07-24 11:51 wutaoKeen 阅读(149) 评论(0) 推荐(0)
摘要:这个题是一个约瑟夫问题,然而是要找规律的:设剩下人数为n,若n是偶数,则一轮过后只剩下奇数位的人,有n = n / 2,原本在奇数位的数字变成(k+1) / 2;若n是奇数,则一轮过后只剩下奇数位的人,特别的原本为第一位的也应被删除,原本第3位的变成第一位,于是有n = (n-1) / 2,原本在奇数位的数字变成(k-1) / 2;经过有限次数后,n一定变成1,这就是最后的save。因此逆推上去就知道save开始所处位置了。View Code #include<iostream>#include<cstdio>#include<cstdlib>#includ 阅读全文
posted @ 2012-07-22 11:14 wutaoKeen 阅读(173) 评论(0) 推荐(0)
摘要:直接打表:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;void 阅读全文
posted @ 2012-07-22 09:58 wutaoKeen 阅读(134) 评论(0) 推荐(0)
摘要:直接打表:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;/*cl 阅读全文
posted @ 2012-07-21 22:59 wutaoKeen 阅读(122) 评论(0) 推荐(0)
摘要:约瑟夫循环问题:Josephus假设n个竞赛者排成一个环形,依次顺序编号1,2,…,n。从某个指定的第1号开始,沿环计数,每数到第m个人就让其出列,且从下一个人开始重新计数,继续进行下去。这个过程一直进行到所有的人都出列为止。最后出列者为优胜者。无论是用链表实现还是用数组实现来解约瑟夫问题都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较麻烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。注意到原问题仅仅是要求出最后的胜利者的序号,而不是要模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。为了讨论方便,先把问题稍 阅读全文
posted @ 2012-07-21 16:30 wutaoKeen 阅读(151) 评论(0) 推荐(0)