您的位置:首页 > 其它

HDU 1443 Joseph

2012-04-14 21:27 330 查看
#include <stdio.h>
#define MAX 27
int next[MAX];
int pre[MAX];
int f(int k)
{
int m;
for(m=k+1;;m++)
{
//badGuys负责坏人的计数,pointer模拟指针在链表中移动
int badGuys=0,found=0,pointer;
//初始化模拟双向链表的数组,总共2*k个人
next[2*k]=1;
pre[1]=2*k;
for(int i=1;i<2*k;i++)
{
next[i]=i+1;
pre[i+1]=i;
}

for(int len=2*k,pointer=2*k;;len--)
{
int road=m%len;
if(road==0)
road=len;
while(road--)
pointer=next[pointer];
if(pointer<=k)
{

break;
}
else
{
badGuys++;
//删除所指坏人结点
int prePtr=pre[pointer];
int nextPtr=next[pointer];
next[prePtr]=nextPtr;
pre[nextPtr]=prePtr;
}
if(badGuys==k)
{
found=1;
break;
}
}
if(found)
break;
}
return m;
}
int main()
{
int k;
int a[14];
//答案存入数组,否则会超时
for(int i=1;i<=13;i++)
a[i]=f(i);
while(scanf("%d",&k),k)
printf("%d\n",a[k]);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: