【hoj】 1017 Joseph's problem II
2014-07-01 23:22
204 查看
这个是约瑟夫的另一个变型,变为总共有2*k个人,先是K个好人后是k个坏人,要求前k次都要杀坏人,即在杀掉第一个好人之前就要把所有的坏人都杀光,所以需要我们求出满足这个条件的最小的m值;
由约瑟夫的递归模型可以发现,我们因为他的递归是从最后杀的人递归到原有的人数,所以我们可以吧顺序反过来,等价于最后杀掉k个坏人,再杀好人,这样在递归的时候就是先知道起始位置(先杀的人),这样就能迭代,由有好人时是否杀的是坏人来判定这个m是否适合,如果k次后杀到了第k个坏人则说明这个m是适合的
参考:http://www.cnblogs.com/wuzhibin/archive/2012/02/17/2356532.html
因为oj上有时间限制,所以把大于10的都计算好了。。。这。。。
由约瑟夫的递归模型可以发现,我们因为他的递归是从最后杀的人递归到原有的人数,所以我们可以吧顺序反过来,等价于最后杀掉k个坏人,再杀好人,这样在递归的时候就是先知道起始位置(先杀的人),这样就能迭代,由有好人时是否杀的是坏人来判定这个m是否适合,如果k次后杀到了第k个坏人则说明这个m是适合的
参考:http://www.cnblogs.com/wuzhibin/archive/2012/02/17/2356532.html
#include <cstdio> #include <iostream> #include <stdlib.h> #include <memory.h> #include <math.h> #include <string.h> using namespace std; int a[19]; int main() { int k,m,ans; a[10]=93313; a[11]=459901; a[12]=1358657; a[13]=2504881; a[14]=13482720; while(cin>>k) { if(k==0) break; else if(k>=10) cout<<a[k]<<endl; else { for(m=1;;m++) { for(ans=0;ans<k;ans++) { int j=ans; for(int i=k+1;i<=2*k;i++) j=(j+m)%i; if(j>=k) break; } if(ans==k) { cout<<m<<endl; break; } } } } return 0; }
因为oj上有时间限制,所以把大于10的都计算好了。。。这。。。
相关文章推荐
- HOJ 1017 Joseff's problem II
- HOJ 1016 Joseph's problem I&&HOJ 2920 Escape
- 【hoj】1196 Power Crisis( Joseph'problem 变型)、1441 Eeny Meeny Moo
- HOJ Train Problem II
- HOJ 1016 Joseph's problem I 约瑟夫环问题
- HOJ 1016 Joseph's problem I
- 【hoj】1016 Joseph's problem I
- A + B Problem II
- XDUOJ Problem 1082 - Let's SPFA II
- A + B Problem II
- hdu 1002 A + B Problem II ( JAVA大数)
- HDU1002 A + B Problem II【大数】
- hdu 1023 Train Problem II(Catlan数)
- 11.17 作业 Problem C: Sequence Problem (II) : Array Practice
- hdu 1002:A + B Problem II(大数问题)
- hdu 1002 A + B Problem II
- ny A+B Problem II
- hdu 1023 Train Problem II 数学catalan数
- HOJ 2739 The Chinese Postman Problem 带权有向图上的中国邮路问题
- NYOJ-A*B Problem II-623