您的位置:首页 > 其它

PKU1012 Joseph 约瑟夫问题

2010-07-13 20:50 232 查看
PKU1012 约瑟夫问题
题意: 2*k个人围成一个圈,前k个人为好人,后k个人为坏人,要求:每查m个人,并将第m个人杀掉,当杀第一个好人时坏人已全部杀光,输出此时m的值

分析:先引入Joseph递推公式,设有n个人(0,...,n-1),数m,则第i轮出局的人为f(i)=(f(i-1)+m-1)%(n-i+1),f(0)=0;
依次我们可以来做测试,只要前k轮中只要有一次f(i)<k则此m不符合题意。
接下来我们考察一下只剩下k+1个人时候情况,那么依题意则这一轮出局的人要么在上一轮出局人的左边,要么就在右边,则必有m%(k+1)==0或1

注:必须打表,否则超时

#include<stdio.h>

int main()

{

int i,j,k,m,kill,rest,a[15];

for(k=1;k<14;k++)

{

j=0;

for(i=k+1;;i+=(j++)%2?k:1)//m要么是(k+1)的整数倍,要么(k+1)的整数倍加1

{

rest=2*k;

m=i;

kill=0;

while(1)

{

kill=(kill+m-1)%rest;//kill的位置,Joseph递推公式

rest--;

if(kill<k) break;

}

if(rest<k) break;

}

a[k]=m;

}

while(scanf("%d",&k)!=EOF&&k)

printf("%d/n",a[k]);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: