題目大意:一個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;
}