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