POJ1012 Joseph
2014-06-27 19:01
387 查看
首先是规规矩矩地计算的代码:
注意这里可以有一个优化:因为在0号到k-1号中,第一个被剔除的是(x-1) mod (2*k)号,显然这个不可以是好人(0-k-1号),利用这点加在Chase函数中判定,可以减少一半的计算量。
另外,由于测试数据有很多重复,所以正常解法很可能TLE。于是打表法诞生了。。。
#include "stdio.h" long Chase(long x,long man){ int q[28]; long ic,jc,kc,cc,p; kc=man;jc=man-1; for(ic=0;ic<man;ic++)q[ic]=1; for(ic=man;ic<(2*man);ic++)q[ic]=2; cc=0;p=(x-1)%(2*man);if(q[p]==1)return 0; q[p]=0; while(1==1){ p=(p-1+x)%(jc+kc); if (p<man)return 0; else { jc--; if(jc==0){return 1;} } } } int main(){ long i,j,k,rb,rg,point; long m; long ans[13]; int q[28],flag; for(i=0;i<14;i++)ans[i]=0; ans[1]=2; while(1==1){ scanf("%d",&k); if(ans[k]!=0){ printf("%d\n",ans[k]); } else{ rb=rg=k;flag=0; if (k==0)break; m=k-1; while(flag==0){ m++; j=Chase(m,k); if(j)flag=1; } printf("%d\n",m); ans[k]=m; } } return 0; }
注意这里可以有一个优化:因为在0号到k-1号中,第一个被剔除的是(x-1) mod (2*k)号,显然这个不可以是好人(0-k-1号),利用这点加在Chase函数中判定,可以减少一半的计算量。
另外,由于测试数据有很多重复,所以正常解法很可能TLE。于是打表法诞生了。。。
#include "stdio.h" int main(){ long k,ans[15]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,0}; while(1==1){ scanf("%d",&k); if(k==0)break; printf("%d\n",ans[k]); } return 0; }
相关文章推荐
- ACM篇:POJ1012--Joseph
- POJ 1012 Joseph
- POJ-1012-Joseph-暴力/模拟
- poj 1012 Joseph
- POJ - 1012 joseph (约瑟夫打表)
- POJ 1012 Joseph 推导,暴力,约瑟夫环,打表 难度:2
- NYOJ 191 && POJ 1012 Joseph(约瑟夫环问题)
- poj1012——Joseph
- POJ 1012 Joseph 笔记 G++
- POJ 1012 Joseph
- POJ 题目1012Joseph(数学,约瑟夫环)
- POJ 1012:Joseph
- poj 1012 Joseph
- poj1012 Joseph题解2
- poj 1012 Joseph(约瑟夫环求每次出圈人的序号)
- poj1012 Joseph
- POJ 1012 Joseph 变形约瑟夫环
- poj 1012 Joseph (约瑟夫问题)
- POJ 1012 Joseph
- POJ 1012 Joseph