ZOJ 1088 System Overload
题目大意:浙大的破网络容量有限,太多人同时使用BBS就会系统崩溃。为了保持系统正常工作,过载时就需要切断部分用户。规则是把玉泉所有的建筑从1到n编号,设定一个常数m。从1开始数,第m幢建筑的网络被切断,然后再从1开始继续往下数。数到n之后回到第1幢。曹光彪大楼的编号是2,这是计算机学院的大本营。此题的目的就是根据上述规则,确定常数m,使得曹楼是全校最后一幢被切断网络的建筑。
解法:在数学界有一个经典的约瑟夫环问题(Josephus Problem)。约瑟夫环问题是这样的,有n个人围成一个圈,分别编号为1,2,3…n,从第1个人开始报数,报到偶数的人出列,剩下的人继续,直到仅剩最后一个人位置。那么,如果我想做这个站到最后的人,最开始我应该站在哪个编号的位置?如果是隔2个人报数,我又应该站在哪里?如果是隔k个人呢?我在Google上搜索的时候看到有人推荐一本书《具体数学》。在这本书的第一章(也许第二章)里有详细的分析和证明。
这道题和约瑟夫环的问题也差不多,指是从后往前倒推。要保证坚持到最后的人是2号,起始位置是1号,报数的间隔是多少。间隔数m从2开始往上一个个地试。判断的精髓就是这个递归公式:k=(k+m-1)%i+1。如果经过n-1次的递归计算,k的值是1,那么这个m就是所求的答案了。
参考代码:
#include<iostream>
using namespace std; int main(){
int n,m,i,k;
while(cin>>n&&n!=0){
for(m=2;m<32767;m++){
k=1;
for(i=2;i<n;i++)
k=(k+m-1)%i+1; //Josephus Problem
if(k==1){
cout<<m<<endl;
break;
} }
} return 0;
}
ZOJ 1088 System Overload的更多相关文章
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- F - System Overload(约瑟夫环变形)
Description Recently you must have experienced that when too many people use the BBS simultaneously, ...
- POJ题目细究
acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP: 1011 NTA 简单题 1013 Great Equipment 简单题 102 ...
- 【转】POJ百道水题列表
以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...
- 详解OJ(Online Judge)中PHP代码的提交方法及要点【举例:ZOJ 1001 (A + B Problem)】
详解OJ(Online Judge)中PHP代码的提交方法及要点 Introduction of How to submit PHP code to Online Judge Systems Int ...
- Adaptive partitioning scheduler for multiprocessing system
A symmetric multiprocessing system includes multiple processing units and corresponding instances of ...
- C10K问题渣翻译
The C10K problem [Help save the best Linux news source on the web -- subscribe to Linux Weekly News! ...
- [Oracle]UNIX与Windows 2000上Oracle的差异(I)
作者:Ian Adam & David Stien, SAIC Ltd 日期:19-Dec-2003 出处:http://www.dbanotes.net翻译:Fenng ---------- ...
- 31. pt-variable-advisor
pt-variable-advisor h=192.168.100.101,P=3306,u=admin,p=admin mysqladmin var>/root/test/pt-variabl ...
随机推荐
- fseek ftell rewind
下面几个函数的头文件 : <stdio.h> fseek int fseek( FILE *stream, long offset, int origin ); 第一个参数stream ...
- MongoDB Aggregate Methods(2) MonoDB 的 3 种聚合函数
aggregate(pipeline,options) 指定 group 的 keys, 通过操作符 $push/$addToSet/$sum 等实现简单的 reduce, 不支持函数/自定义变量 g ...
- grub2的使用
1,添加win 启动项 edit file: /boot/grub2/grub.cfg 插入这几行: menuentry 'Windows XXX' { set root=(hd0,) chainlo ...
- sql游标的使用入门
游标的理解: 游标其实可以理解成一个定义在特定数据集上的指针,我们可以控制这个指针遍历数据集,或者仅仅是指向特定的行,所以游标是定义在以Select开始的数据集上的 普通的sql语句是面向集合的,游标 ...
- iOS中类方法的作用
类方法,这意味着你将它发送给类,而不是对象实例. 因为不是发送给一个实例,所以你不能使用任何实例变量,你只能做一些通用性的事情. 实际上类方法只用于两种情况: 1.创建事物,比如创建一个特殊格式的字符 ...
- c# access插入null值
c# 插入access数据库 提示错误: Parameter @DeviceLocation has no default value. 参数@DeviceLocation 的有没有默认值. Stri ...
- 关押罪犯(noip2010)
解法: (1)搜索(30分) (2)二分(此题属于最大值最小问题) (3)贪心+并查集 下面着重说一下“贪心+并查集” 因为有A.B两座监狱,每个犯人不是在A,就是在B监狱. 至于每个犯人在那个监狱, ...
- Ubuntu 14.10 下grep命令详解
简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...
- 文本编辑器vim
Vim是一个功能强大的全屏幕文本编辑器,是Linux/UNIX上最大的文本编辑器,它的作用是建立.编辑.显示文本文件. Vim没有菜单,只有命令.
- 1、SQL基础整理(基本查询)
分离.附加.备份.还原 --去重 select distinct 列名from表名 --更新 update fenshu set name = ‘李四’where code = 9 --更改表名 sp ...