天天看點

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;
}