您的位置:首页 > 其它

hdu 1443 Joseph

2014-07-29 11:00 351 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1443

先把神级代码双手奉上....虽然看不懂吧...囧

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