hdu 1443 Joseph
2014-07-29 11:00
351 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1443
先把神级代码双手奉上....虽然看不懂吧...囧
再把神奇代码奉上...打表
再说这几个数是怎么来的.....
这代码竟然没超时T_T.....
先把神级代码双手奉上....虽然看不懂吧...囧
#include<stdio.h> int ans[14]={0}; int joseph(int k) { int cnt,p; if(ans[k])return ans[k]; for(int i=k+1;;i++) { for(cnt=k<<1,p=0;cnt>k;cnt--) { p=(p+i-1)%cnt; if(p<k)cnt=0; } if(cnt==k) { ans[k]=i; return i; } } return 0; } int main() { int n; while(scanf("%d",&n),n) { printf("%d\n",joseph(n)); } return 0; }
再把神奇代码奉上...打表
#include<stdio.h> int main(){ int n,a[14]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881}; while(scanf("%d",&n)&&n) printf("%d\n",a ); return 0; }
再说这几个数是怎么来的.....
#include<iostream> using namespace std; typedef struct joseph { int next; int pre; int cur; }joseph; int main() { int k,m,count,total,i,j,rec1,rec2,a[14]; joseph p[30]; count=0; for(j=1;j<=13;j++) { for(m=2;count!=j*2;m++) { for(i=0;i<2*j;i++) { p[i].cur=i; p[i].next=i+1; p[i].pre=i-1; } p[2*j-1].next=p[0].cur; p[0].pre=p[2*j-1].cur; //将每个人连成环 count=0; rec1=0; total=2*j; do { for(i=1;i<=(m-1)%total;i++) {rec1=p[rec1].next;} //一个一个往后移动,直到不能再移动了 rec2=p[rec1].next; p[p[rec1].pre].next=rec2; p[rec2].pre=p[rec1].pre; //删除需要出圈者 if(p[rec1].cur>=0 && p[rec1].cur<j) //出圈了好人,跳出该m值的循环 { break; } else { rec1=rec2; count++; //出圈一个坏人计数器加1 } total--; //出圈一人后总人数记得减一 }while(count!=j); if(count==j) //出圈好人前出圈完K个坏人,满足条件 { a[j]=m; break; } } } while(cin>>k && k) { cout<<a[k]<<endl; } return 0; }
这代码竟然没超时T_T.....
相关文章推荐
- hdu 1443 Joseph (约瑟夫环)
- HDU 1443 Joseph
- HDU 1443 Joseph
- HDU 1443 Joseph
- HDU 1443 Joseph
- hdu 1443 Joseph+暴力打表
- HDU1443 Joseph
- hdu 1443 Joseph (约瑟夫环)
- HDU 1443 Joseph
- hdu -- 1443 Joseph
- hdu 1443 Joseph+暴力打表
- HDU:1443Joseph(一个超级无耻的…
- HDU1443-Joseph
- HDU 1443 Joseph
- HDU 1443 Joseph
- HDU 1443 Joseph
- hdu 1443 Joseph(约瑟夫环+枚举)
- HDU 1443 Joseph
- poj 1012 & hdu 1443 Joseph(约瑟夫环变形)
- hdu 1443 Joseph (约瑟夫环)