poj1012——Joseph

本文介绍了一种解决约瑟夫环问题的有效算法,并通过示例代码详细展示了该算法的具体实现过程。针对传统暴力方法效率低下的问题,提供了一种优化方案。

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

约瑟夫环问题。

其中的注释部分为暴力方法,这明显会tle。

so 参考:http://hi.baidu.com/autogerk/blog/item/3ec31065699e6df9f636546e.html

这篇也很有意思:http://www.9php.com/FAQ/cxsjl/c/2007/03/403506277877.html

#include<cstring> #include<cstdio> #include<iostream> using namespace std; //bool vis[20]; int arr[15]; //bool solve(int n,int k) //{ // memset(vis,true,sizeof(vis)); // int cout=0;int i=0,j=0; // while(cout<n/2) // { // i=i%n; // if(vis[i]) // { // j++; // if(i>=n/2&&j==k) // { // cout++; // if(cout==n/2 )return true; // j=0; vis[i]=false; // } // else if(j==k&&i<n/2) return false; // // } i++; // } // return false; //} //int f(int n) //{ // int i; // for(i=2;;i++) // { // if(solve(n,i)) // { // return i; // } // } //} void solve(int n) { int len=n*2; int s,m=n+1; while(1) { s=0; int cout=0; while(cout<n) { int k=(s+m-1)%len; if(k>=n) { cout++; if(cout==n) { arr[n]=m; printf("%d\n",m); return ; } s=k; len--; } else { m++; s=0;len=n*2; break; } } } } int main() { int n; memset(arr,0,sizeof(arr)); while(1 ) { cin>>n; if(n==0) break; if(arr[n]) printf("%d\n",arr[n]); else solve(n); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值