您的位置:首页 > 其它

poj1012 Joseph题解2

2010-08-11 13:03 405 查看
之前用链表模拟了Joseph环,但是代码非常的长。

poj1012 Joseph题解:http://blog.csdn.net/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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: