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