Poj 1012 Joseph (约瑟夫环)

来源:互联网 发布:金麦软件 编辑:程序博客网 时间:2024/05/21 15:38

题目链接: http://poj.org/problem?id=1012

题意:

有k个坏人k个好人坐成一圈,前k个为好人(编号1~k),后k个为坏人(编号k+1~2k)

现在有一个报数m,从编号为1的人开始报数,报到m的人就要自动死去。

问当m为什么值时,可以使得在出现好人死亡之前,k个坏人先全部死掉?


思路:约瑟夫环的变形问题,前k个退出的人必定是后k个人,所以只要前k轮中只要有一次f(i)<k则此m不符合题意


这里:http://blog.chinaunix.net/uid-26943806-id-3228189.html

有我第一次做这道题时的代码,现在我都没想清楚当时是怎么想出那么复杂的判断条件的。。。


P.S.重新看当时训练赛的情况,这道题好多人都是直接打表过的啊,这不科学!!!


#include <cstdio>#include <cstring>#include <iostream>using namespace std;int ans[15],data[15];//int data[]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,1245064};void init (){for (int k=1;k<14;k++){int m=1;memset(ans,0,sizeof(ans));for (int i=1;i<=k;i++)        {            ans[i]=(ans[i-1]+m-1)%(2*k-i+1);            if (ans[i]<k)            {                  i=0;                m++;            }        }data[k]=m;}}int main (){int k;init ();while (scanf("%d",&k) , k)printf("%d\n",data[k]);return 0;}


原创粉丝点击