1067 - 约瑟夫——中级
打表处理(否则Case 1超时)
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。对m进行枚举,每次枚举进行一次判断
因为好人坏人均为k个,那么只要让下一个死亡的人的位置p保证在1~剩余坏人数量之间即可,不满足则直接break枚举下一个m
实际上对于m,因为m必须是 [2kC+1,2kC+k] C∈N+ 之间的数,所以还能再优化,但下面的代码已经能够在78ms左右过题,故可以忽略
1 /* 2 Written By. StelaYuri 3 */ 4 #include<stdio.h> 5 int main(){ 6 int s[14],k,m,p,d; 7 for(k=1;k<14;k++){ 8 m=k; 9 while(1){ 10 for(d=p=0;d<k;d++){ 11 p=(p+m-1)%(2*k-d); 12 if(p<k) 13 break; 14 } 15 if(d==k) 16 break; 17 m++; 18 } 19 s[k]=m; 20 } 21 while(scanf("%d",&k)!=EOF) 22 printf("%d\n",s[k]); 23 return 0; 24 }
更多精彩