#include <stdio.h>
int main()
{
int k;
int a[15]={0};//a[k]存储最小的m(0<k<14)
while(1)
{
scanf("%d",&k);
if(k==0)break;
if(a[k]==0) //如果未计算过,使用枚举法找最小的m,主要考虑到测试数据中可能有重复的k,否则可能会超时
{
int m=k+1; //初始化m,被杀的一定大于k
int n=2*k; //共有n个guys(1~n形成一个环)
while(1)
{
int pre=n,delc=0;//delc存储已杀的数目
int mm=n;//mm为剩余的人数
int p=1;//pre是p的前驱位置
while(delc<k)
{
int nn = m%mm;
p=(pre+nn)%mm;//p为被杀的人的位置,当p值大于k时杀的人是bad guy
if(p==0) p = mm;
if(p>k)//杀一个bad guy
{
mm--;
pre=p-1;
delc++;
}
else break;
}
if(delc == k) break; //已经杀了k个bad guys,找到了问题的解
m++; //枚举下一个m
if(m%n==1) m = m+k; //因为第一个被杀的人一定是编号大于k的人
}
a[k]=m; //存储结果
}
printf("%d\n",a[k]);
}
return 0;
int main()
{
int k;
int a[15]={0};//a[k]存储最小的m(0<k<14)
while(1)
{
scanf("%d",&k);
if(k==0)break;
if(a[k]==0) //如果未计算过,使用枚举法找最小的m,主要考虑到测试数据中可能有重复的k,否则可能会超时
{
int m=k+1; //初始化m,被杀的一定大于k
int n=2*k; //共有n个guys(1~n形成一个环)
while(1)
{
int pre=n,delc=0;//delc存储已杀的数目
int mm=n;//mm为剩余的人数
int p=1;//pre是p的前驱位置
while(delc<k)
{
int nn = m%mm;
p=(pre+nn)%mm;//p为被杀的人的位置,当p值大于k时杀的人是bad guy
if(p==0) p = mm;
if(p>k)//杀一个bad guy
{
mm--;
pre=p-1;
delc++;
}
else break;
}
if(delc == k) break; //已经杀了k个bad guys,找到了问题的解
m++; //枚举下一个m
if(m%n==1) m = m+k; //因为第一个被杀的人一定是编号大于k的人
}
a[k]=m; //存储结果
}
printf("%d\n",a[k]);
}
return 0;
}
在poj 上AC了,344MS。之后看了网上的数学推导,感觉数学的方法还是不太好想,个人认为我这个好理解一些,时间上可能不是很快!