DrizzleX

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
#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]);

} 
posted on 2012-04-14 21:27  DrizzleX  阅读(317)  评论(0)    收藏  举报