您的位置:首页 > 其它

HDU 1443 Joseph

2015-06-04 19:55 246 查看
题目链接: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;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: