HDU 1443 Joseph

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1443

都忘记约瑟夫问题的解法了,纠结了很久,使用链表模拟搞了半天还有问题,搜题解解决的,表示要加油了。

解题思路,使用约瑟夫公式:p=(p+m-1)%n;获取下一个将被踢出去的人。

将m从k+1开始++,直到遇到m满足条件即可。

为什么从k+1开始呢?因为最后至少要执行k+1步才能将最后一个bad guy踢出去。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[20];
int main(){
	int k;
	memset(a,0,sizeof(int));
	while(scanf("%d",&k)==1&&k!=0){
	   if(a[k]!=0){
	   	printf("%d\n",a[k]);
	   	continue;
	   }
		for(int i=k+1;;i++){
			int p,cnt;
			for(p=0,cnt=k<<1;cnt>k;cnt--){
				p=(p+i-1)%cnt;
				if(p < k){
					cnt=0;
				}
			}
			if(cnt==k){
				a[k]=i;
				printf("%d\n",i);
				break;
			}
		}
	}
}

 

posted @ 2015-06-04 19:55  湖心北斗  阅读(252)  评论(0编辑  收藏  举报