C++,n个人围成一圈,从第一个人开始报数……

cnpws 2009-12-12 06:45:59
1、2、3 凡报到3的退出圈子,问最后剩下的人在原来是第几号?
...全文
899 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dashashi 2009-12-13
  • 打赏
  • 举报
回复
有一个O(n)的优化算法
懒得解释了……给个链接自己去看看吧,挺简单的
http://baike.baidu.com/view/213217.htm?fr=ala0
另外还可以进一步优化,当m很小,n很大的时候,对于大部分的f=(f+m) mod i,(f+m)都是小于i的,然后就可以利用下面的递推式
for(i=2; i<n;)
{
t = (i-ans-1) / m+1;
if (i+t > n)
t = n-i;
i += t;
ans = (ans + t*m) % i;
}
实际上就是不是每次递推都增加1,而是增加使(f+m)小于i的一个量t,这样子速度又会大幅度提高。
最朴素的算法复杂度是O(nm)的,递推算法是O(n)的,下面的优化算法复杂度我不会算……
yunfeng7854 2009-12-12
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
const int n = 5;

int main()
{
int i,j,a[n+1],m;
for(i = 0;i < n;i++)
{
a[i] = i + 1;
}
i = -1;
m = n;
while(m)
{
i += 3;
i = i % m;
cout<<a[i]<<endl;
for(j = i;j < m - 1;j++)
{
a[j] = a[j+1];
}
m--;i--;
}
return 0;
}
mstlq 2009-12-12
  • 打赏
  • 举报
回复
请自行google“约瑟夫环”
cnpws 2009-12-12
  • 打赏
  • 举报
回复
555 我完全不会做。。。。

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧