poj1012 Joseph题解2

本文介绍了一种简化版的Joseph环问题求解方法,通过使用一个变量记录剩余人数而非链表,大大简化了代码实现。文章提供了一个具体的C++代码示例,并展示了如何通过迭代找到特定条件下最后一个存活者的编号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前用链表模拟了Joseph环,但是代码非常的长。

poj1012 Joseph题解:http://blog.youkuaiyun.com/Justmeh/archive/2010/08/11/5803590.aspx

我们注意到题目中并没有要求我们求出最后的剩余的人是第几个,所以与经典的Joseph环还是太一样,我们根本用不着用链表来模拟。只需要一个记录剩余环中的人数的变量即可,这样代码简洁多了,如下:

#include<iostream> #include<vector> using namespace std; int result[13] = {0}; int SolveJoseph(int personNum) { int loopLen = 2*personNum; int m,i = 1; bool succeed ; if(result[personNum-1]) { m = result[personNum-1]; return m; } while(1) { m = (personNum+1)*i; for(int j=0;j<2;j++) { m += j; int next = 0; succeed = true; for(int leftNum = loopLen;leftNum>personNum;leftNum--) { next = (m+next-1)%leftNum; if(next<personNum) { succeed = false; break; } } if(succeed) { result[personNum-1] = m; return m; } } i++; } return m; } int main() { int personNum; vector<int> vm; while(cin>>personNum && personNum>0) { int m = SolveJoseph(personNum); vm.push_back(m); } for(int i=0;i<vm.size();i++) { cout<<vm[i]<<endl; } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值