博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1012 Joseph 约瑟夫问题
阅读量:4684 次
发布时间:2019-06-09

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

早上去图书馆复习苦逼的复习。。。。万恶的数逻。T T我还要自我安慰的说复习完了奖励回来刷水题~

10点多的时候外面校运会大吼撑杆跳的那个。等到解说说要破纪录了,哥哥我果断收拾东西,跑去看,结果即将到的时候说跳过去了记录破了T T哭瞎了。

---------------------------------------------------大家好,我是分割线---------------------------------------------------

暴力的话肯定悲剧。好吧,不会做。搜题解的。(说好的奖励刷水题QAQ)

首先说一下约瑟夫问题:N个人围成一圈,从第一个开始报数,第m个将被杀掉,最后剩下一个,其余人都将被杀掉。

题目大意:

给定一个数k,前面k个人是好人,后面k个人是坏人,要求找到最少的报数号码m,使得在好人被杀之前坏人全部死亡。

设有n个人(0,...,n-1),数m,则第i轮出局的人为f(i)=(f(i-1)+m-1)%(n-i+1),f(0)=0; f(i) 表示当前子序列中要退出的那个人(当前序列编号为0~(n-i));

拿个例子说:K=4,M=30;

f(0)=0;
f(1)=(f(0)+30-1)%8=5; 序列(0,1,2,3,4,5,6,7)中的5
f(2)=(f(1)+30-1)%7=6; 序列(0,1,2,3,4,6,7)中的7
f(3)=(f(2)+30-1)%6=5; 序列(0,1,2,3,4,6)中的6
f(4)=(f(3)+30-1)%5=4; 序列(0,1,2,3,4)中的4

.......

依据题意,前K个退出的人必定是后K个人,所以只要前k轮中只要有一次f(i)<k则此m不符合题意。

可以打表直接过的。

#include
int ans[29]={0};int joseph[15];int main(){ int k; while(scanf("%d",&k),k) { if(!joseph[k]) { int n= k<<1; ans[0]=0; int m=1; for(int i=1;i<=k;i++) { ans[i]=( ans[i-1]+m-1) %(n-i+1); if(ans[i]

打表。

#include
int joseph[]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,1245064};int main(){ int k; while(scanf("%d",&k),k) { printf("%d\n",joseph[k]); }}

转载于:https://www.cnblogs.com/murmured/p/5004229.html

你可能感兴趣的文章
带ifrmae的弹窗
查看>>
20172310 2017-2018《程序设计与数据结构》(下)第二周学习总结
查看>>
oj教程--坑
查看>>
C#中webBrowser加载页面中的不同域的iFrame的源代码的取得
查看>>
iOS/Android 微信及浏览器中唤起本地APP
查看>>
[Usaco2005 nov]Grazing on the Run 边跑边吃草 BZOJ1742
查看>>
flex中dragdrop不响应的原因
查看>>
.Net学习笔记----2015-07-08(基础复习和练习01)
查看>>
如何执行一条命令在C#里面。Process
查看>>
【视频处理】YV12ToARGB
查看>>
2014-7-11 今天加了点有意思的特性
查看>>
QT内label控件通过opencv显示图像
查看>>
SQL数据库可疑恢复 挂起恢复 置疑恢复 SQL数据库无法附加修复 附加报错 9003
查看>>
第一次申请
查看>>
mysql创建表与索引
查看>>
1#Two Sum(qsort用法)
查看>>
windows 如何查看端口占用情况?
查看>>
关于mysql8.0.11版本在win10安装
查看>>
linux ncat命令
查看>>
Spark 各个组件关系
查看>>