hdu 2211 杀人游戏
来源:互联网 发布:国家对人工智能的政策 编辑:程序博客网 时间:2024/05/19 05:34
这道题做的人不多,而且网上凡是用递归解决的都缺少推导过程,笔者安安静静的动笔算了一遍,发现这道题的两个关键点——
希望阅读者珍惜笔者的劳动成果,转载请注明出处:
http://blog.csdn.net/u012717411
★先说递归思想:递推关系+边界条件,二者缺一不可。这道题的递推关系是根据前一轮胜利者的编号确定当前轮胜利者的编号,一直递推下去到最后一轮(也就是边界条件),胜利者在1,2,3,……,k-1,k的第k个位置上。即n==k时,返回k.
★再说整除方程(返回值的确定)。
如果你查阅相关结题报告,凡是递归解决的无外乎这样一段话:
这句话只是结论呦,推导看我的吧~
设上一轮胜利者的编号为x,当前轮胜利者的编号为y,容易推到得到这样的一个方程:y=y/k+x
式子意义是当前编号=这一轮在y之前被杀死的数量+上一轮在y之前剩下的数量x
注意,这可不是一般的方程哦,/表示的是整除,不要左右同×k,结果不等价的。
这样的方程笔者姑且叫她整除方程吧,利用不等式求解。求解思路如下:
●Step1 首先观察到y无法直接求解,不妨先求y/k,设m=y/k,则y=m+x(x已知),问题转化为求整除结果m.
●Step2 由y/k=m有,m·k+1<=y<=m·k+(k-1).为什么是m·k+1<=y而不是m·k<=y,因为y表示的是当前这轮胜利者的编号,不到最后一轮不会出现y%k==0的情况(最后一轮已经被返回了)。令y=m+x,代入得到
m·k+1<=m+x<=m·k+(k-1),原不等式组等价于
m·(k-1)<=x-1<=m·(k-1)+(k-2).
看出来没有??!!!把她反一下就可以表示为m=(x-1)/(k-1),两者表示的含义是不是等价的????!!!!Yes!!
那么m就求出来啦.则y=y/k+x=m+x=(x-1)/(k-1)+x了,参考递归代码:
#include <iostream>using namespace std;int myfun(int n,int m){ if(m==n)return m; int k=myfun(n-n/m,m); return (k-1)/(m-1)+k;}int main() { // insert code here... //std::cout << "Hello, World!\n"; int t; cin>>t; while (t--) { int n,m; cin>>n>>m; printf("%d\n",myfun(n,m)); } return 0;}
- hdu-2211 杀人游戏
- hdu 2211 杀人游戏
- HDU 2211 杀人游戏
- hdu 2211 杀人游戏
- hdu 2211 杀人游戏
- HDU-2211-杀人游戏
- 【HDU 2211】【水题】杀人游戏
- 递归+整除方程:hdu 2211 杀人游戏
- HDU 2211 杀人游戏(数学)
- hdu 2211 杀人游戏 ~~~应该算是数学问题~~
- 杭电2211杀人游戏
- 杀人游戏
- 杀人游戏
- hdoj 2211 杀人游戏 【约瑟夫环】
- 杀人游戏的玩法
- 什么是杀人游戏
- 杀人游戏攻略
- SOA杀人游戏
- 【剑指offer】面试题35-第一个只出现一次的字符
- ajax最好要加async
- Map——几种不同的遍历方式
- 产品需求文档(PRD)写作(一) 写前准备(信息结构图)
- centOs ftp服务
- hdu 2211 杀人游戏
- 不良资产量化处置过程风险的方法和建议
- Java基本概念-线程开发
- 【C#】信息管理系统核心—SQLHelper+配置文件+SQLServer增删改查
- 【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则
- springMVC 使用注解注入接口实现类
- BZOJ 1040: [ZJOI2008]骑士 基环树套DP
- JavaSE——UDP协议网络编程(二)
- 子午线弧长