博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
新第k人
阅读量:2038 次
发布时间:2019-04-28

本文共 1278 字,大约阅读时间需要 4 分钟。

题解:经典的约瑟夫环问题

参考

如果不一次处理完,重复操作可能超时

C++版本一

/**@Author:   STZG*@Language: C++*/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#define DEBUGusing namespace std;typedef long long ll;const int N=10000+10;const double PI = acos(-1.0);const double EXP = 1E-8;const int INF = 0x3f3f3f3f;int t,n,m;int a[N];int yuesefu(int n,int m){ if(n == 1){ return 0; //这里返回下标,从0开始,只有一个元素就是剩余的元素0 } else{ a[n-1]=yuesefu(n-1,m); return (a[n-1] + m) % n; //我们传入的n是总共多少个数 }}int main(){#ifdef DEBUG freopen("input.in", "r", stdin); //freopen("output.out", "w", stdout);#endif scanf("%d",&t); a[10000]=yuesefu(10000,233); while(t--){ scanf("%d",&n); cout<
<

C++版本二

题解:

因为一直k 是233,所有人站成一个环,如果知道了x 个站成一个环的时候,出去人的相对顺序(最后一个出去的人的序列是1,第一个出去的人的编号是x),那么可以通过这个顺序知道x+1 个人占成一个环的时候,出去的相对顺序。即找到编号为x 的人,往前数232 个人和第233 个人之间插入一个位置,这个位置就是编号为x+1 的人。

#include
using namespace std;const int N = 1e5 + 10;int f[N];int main(){ f[1] = 0; for(int i = 2; i < N; ++i) f[i] = (f[i - 1] + 233) % i; int t; scanf("%d", &t); while(t--){ int n; scanf("%d", &n); printf("%d\n", f[n] + 1); } return 0;}

 

转载地址:http://myzof.baihongyu.com/

你可能感兴趣的文章
实现输出h264直播流的rtmp服务器
查看>>
如何使用DroidDraw和AnDroidDraw开发Android UI界面
查看>>
在iOS上使用ffmpeg播放视频
查看>>
编译Android下可用的FFmpeg+x264
查看>>
OkHttp–支持SPDY协议的高效HTTP库
查看>>
DroidDraw使用
查看>>
初识PhoneGap
查看>>
iOS中arc的设置与使用
查看>>
iOS上OCR SDK
查看>>
iOS6新特征:UICollectionView介绍
查看>>
【管理心得之三】管理者们扪心自问一下 “你们杀了几个属下”
查看>>
Android 中文 API (40) —— RatingBar
查看>>
软件设计_接口_中间层
查看>>
iBeacons
查看>>
Linux修改文件及文件夹权限
查看>>
在PPT和Word中添加带有语法高亮的代码块
查看>>
iOS5:[UIDevice uniqueIdentifier]的替代方案
查看>>
四步轻松实现用Visio画UML类图
查看>>
CocoaTouch框架一览表
查看>>
Android anotations试用
查看>>