题目链接:
POJ 1012: http://poj.org/problem?id=1012
HDU 1443: http://acm.hdu.edu.cn/showproblem.php?pid=1443
约瑟夫环(百度百科): http://baike.baidu.com/view/717633.htm?fr=aladdin
Description
Input
Output
Sample Input
3 4 0
Sample Output
5 30
Source
题意:
共有 k 个坏人 k 个好人坐成一圈(总人数就为2*k),前面的 k 个为好人(编号1~k),后面的 k 个为坏人(编号k+1~2k),
现有一个报数为 m ,从编号为 1 的人开始报数,报到 m 的人会自动的死去。
求当 m 为何值时,可以使在出现有好人死亡前,k 个坏人已经全部死掉?
注意: 当前一轮第 m 个人死后,下一轮的编号为1的人是前一轮编号为 m+1 的人,
若前一轮恰好是最后一个人死掉,则下一轮循环回到开头那个人报“1”
k比较小,直接暴力打表!
#include <cstdio>
int main()
{
int p[17], ans[17] = {0};
int m, k;
for(k = 1; k <= 14; k++)
{
int n = 2*k;//总人数
m = 1;
for(int i = 1; i <= k; i++)
{
//因为编号是从1开始的
ans[i] = (ans[i-1]+m-1)%(n-i+1);
if(ans[i] < k)//说明杀掉了好人,不符合题意
{
i = 0;
m++;//枚举
}
}
p[k] = m;
// printf("%d\n",p[k]);
}
// return 0;
int kk;
while(scanf("%d",&kk) && kk)
{
printf("%d\n",p[kk]);
}
return 0;
}
poj 1012 & hdu 1443 Joseph(约瑟夫环变形)
原文地址:http://blog.csdn.net/u012860063/article/details/39002333