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;
}
}
}
}

浙公网安备 33010602011771号