先介绍下约瑟夫环的背景:点击打开链接
题目大意:k个人好人,k个坏人站成一列,要让前k次杀死的都是坏人,求这个m_th最小是多少
题目分析:这个题目的模拟很有意思,从k+1开始枚举,代码很清晰
如下:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int res[16];
int solve(int k)
{
int ans,m;
if(res[k]!=0)
return res[k];
for(ans=k+1;;ans++)
{
int sum=2*k;
for(m=ans;;m+=ans-1)
{
if(m>=sum)
m= m%sum?m%sum:sum;
if(m<=k)
break;
else
sum--;
if(sum==k)
{
res[k]=ans;
return res[k];
}
}
}
}
int main()
{
int k,m;
memset(res,0,sizeof(res));
for(k=1;k<14;k++)
solve(k);
while(scanf("%d",&k)!=EOF&&k)
{
printf("%d\n",res[k]);
}
return 0;
}