题目大意:一个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;
}