您的位置:首页 > 其它

POJ1012 Joseph

2014-06-27 19:01 387 查看
首先是规规矩矩地计算的代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  POJ Joseph