现在的位置: 首页 > 综合 > 正文

Poj 1012 Joseph (约瑟夫环)

2014年02月27日 ⁄ 综合 ⁄ 共 746字 ⁄ 字号 评论关闭

题目链接: 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;
}

抱歉!评论已关闭.