天天看点

POJ 1012 Joseph(约瑟夫环)(枚举)

题目大意:一个n个人的约瑟夫环,每m个人一杀,k个好人,k个坏人,找出满足让k个坏人先死的最小情况m。

思路:约瑟夫环的套路,每次更新环的编号。

举例:

代码:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int Joseph[15]={0};//打表
    int k;
    while(~scanf("%d",&k)&&k)//判断0的情况
    {
        if(Joseph[k])//如果是存入的数据,直接输出
        {
            printf("%d\n",Joseph[k]);
            continue;
        }
        int n=2*k,m=1;//m作为符合条件的最小报数
        int flag[30]={0};//作为幸存的人的编号
        for(int i=1;i<=k;i++)//杀了i个人的情况
        {
            flag[i]=(flag[i-1]+m-1)%(n-i+1);//n-i为当前剩余的人数,此时是将幸存人数重新编号
            if(flag[i]<k)//好人被杀的时候,m++
            {
                i=0;
                m++;
            }
        }
        Joseph[k]=m;//暂时保存下
        printf("%d\n",m);
    }
    return 0;
}