POJ 1012 Joseph
来源:互联网 发布:松视台直播软件apk 编辑:程序博客网 时间:2024/05/13 22:13
考验思维能力的一道题
一开始用了最笨的方法,一个一个数,结果k到10就跑不出来了
后来看了discuss,可以推公式,这样就可以直接推得下一个杀人的位置,不必一个一个数了,时间可以节省非常多,自己找了小点的k尝试了下,推出了公式,我们从点1开始编号,则初始情况一共有2*k个点
假设b为已经杀掉的人数,now为现在的起始位置,next为下一个杀掉人的编号,初始时,b=now=0
则第一步,next=(0+m-1)%(2k-0)+1,(减1取模后再加1,为了防止0的出现),编号为next的人被杀掉,注意,此时的now不是next,而是next-1!然后再循环找下去就行,next=(now+m-1)%(2*k-b),由于不需要知道被杀掉的人原来的编号,杀掉这个人后,我们可以把整个环的数量减1,而所有坏人和好人都是还是各自连在一起的,所以不会有影响
后来看了discuss后,经牛人点拨,得知m必定为k+1的整数倍或者k+1的整数倍加1,为什么呢?考虑只剩下两个坏人时,他们此时的编号为k+1和k+2,如果杀掉的是k+1,那么走m=n*(k+1)+1步后可以杀掉原来编号为k+2的人,而如果先杀掉的是原来编号为k+2的,那么走m=n*(k+1)步后可以杀掉原来编号为k+1的人。这个解释太精彩了!这样优化后,可以从200多ms跑到100ms左右
总结:做题就是这样的,先从最笨的方法开始,然后在此基础上进行优化,另外,对于一些规律性的东西,可以从特殊情况或者最简单的情况去挖掘信息!还有,这题有很多组测试数据,但最多13种情况,我们可以将某种情况算出来的结果保存下来,下次再测试时直接输出!
代码:
- POJ 1012 Joseph
- POJ 1012 Joseph
- POJ 1012 Joseph
- POJ 1012 Joseph
- poj 1012 Joseph
- POJ 1012 Joseph
- poj 1012 Joseph
- 【POJ】1012 Joseph
- poj 1012 Joseph
- poj-1012 Joseph
- POJ 1012 Joseph
- poj 1012 Joseph
- Poj 1012 Joseph
- POJ - 1012 Joseph
- [POJ][1012]Joseph
- POJ 1012 Joseph
- POJ 1012 Joseph
- POJ 1012 Joseph(打表题)
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
- 数据库笔试题
- HDU 1951 Vase collection
- android电源管理
- 在 研究完成端口时 遇到 GetSystemInfo 做下记录
- POJ 1012 Joseph
- 利用C#操作注册表 创建快速启动程序
- fatal error C1010: unexpected end of file while looking for precompiled header directive
- AT&T略记
- 医疗信息学国际研讨班(IWMI 2011)
- RLP
- 渗透辅助利器:端口转发工具源码解析
- 经典的Photoshop技巧大全
- java GUI 2