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
注:必须打表,否则超时
题意: 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; }
相关文章推荐
- PKU1012 约瑟夫问题
- PKU ACM 1012 Joseph 约瑟夫
- 约瑟夫问题 pku1012(转自奋斗青春(亚伟)blog)
- poj 1012 Joseph (约瑟夫问题)
- poj 1012 Joseph 约瑟夫问题 (★★☆☆☆)
- poj 1012 Joseph (约瑟夫问题)
- POJ 1012 && HDU 1443 Joseph(约瑟夫问题)
- 新随笔-约瑟夫问题(pku 1012)
- POJ-1012 Joseph-约瑟夫问题好人坏人
- PKU ACM 1012 JOSEPH问题
- 1012-Joseph 约瑟夫问题
- POJ 1012 Joseph 约瑟夫问题
- 约瑟夫 (Joseph) -- ACM PKU 1012 解题报告
- 1012 Joseph 约瑟夫问题 总结了一个公式 n人报m第t轮出列的人的编号(从0到n-1)
- PKU 1012 Joseph
- POJ - 1012 joseph (约瑟夫打表)
- POJ 1012 约瑟夫问题
- 约瑟夫问题(Joseph)
- 算法: 约瑟夫问题(Joseph Problem)的分析
- (2011.11.20)02_循环链表举例_约瑟夫(Joseph)环问题.cpp