HDU-2211-杀人游戏
2017-09-06 22:39
127 查看
ACM模版
结论倒是不难理解,每次返回剩下的人中重新编号后的序号,那么撤回一轮游戏后的编号自然就是这一轮游戏最后的死亡编号加上这一轮游戏中杀死的人数,那么这个杀死的人数自然就是 x−1k−1,所以也就达成了这个递归关系了。
虽然挺好理解的,但是着实不好想,坑了点。本来想用这个题测试我的约瑟夫环问题的模版,却发现这个其实并不能说是约瑟夫环了,因为已经不是环了……还好我测试出来了自己的代码是对的,不过对于这个题是错的罢了……
描述
题解
首先我们来说一下结论:设 f(n) 返回在一论游戏中最后死亡的人的编号,那么剩下的人也就是 n−nk,在这剩下的人里进行一轮游戏最后死于乱棍之下的编号为 f(n−nk),当然,这里的编号说的是剩下的人重新排序后的编号,所以记为 x,那么我们如果恢复到前一轮 x 的编号时,那就是 x−1k−1+x,所以呢,f(n)=x−1k−1+x,注意,这里是递归关系。结论倒是不难理解,每次返回剩下的人中重新编号后的序号,那么撤回一轮游戏后的编号自然就是这一轮游戏最后的死亡编号加上这一轮游戏中杀死的人数,那么这个杀死的人数自然就是 x−1k−1,所以也就达成了这个递归关系了。
虽然挺好理解的,但是着实不好想,坑了点。本来想用这个题测试我的约瑟夫环问题的模版,却发现这个其实并不能说是约瑟夫环了,因为已经不是环了……还好我测试出来了自己的代码是对的,不过对于这个题是错的罢了……
代码
#include <cstdio> #include <iostream> using namespace std; int n, k; int f(int n) { if (n == k) { return k; } int x = f(n - n / k); return (x - 1) / (k - 1) + x; } int main() { int T; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &k); printf("%d\n", f(n)); } return 0; }
测试结果
测试代码是错的,因为我读错题了,以为还是环,其实不是,如果是环的话,样例中最后的结果应该是 4,我测试模版,的确是这样,所以模版没有什么问题,只是我的眼有问题……相关文章推荐
- 递归+整除方程:hdu 2211 杀人游戏
- hdu 2211 杀人游戏
- HDU 2211 杀人游戏(数学)
- hdu 2211 杀人游戏
- hdu 2211 杀人游戏
- hdu 2211 杀人游戏
- hdoj 2211 杀人游戏 【约瑟夫环】
- 杭电2211杀人游戏
- hdu_3067_小t的游戏(脑洞)
- HDU-1527 取石子游戏
- 翻纸牌游戏 HDU - 2209
- 2013金山西山居创意游戏程序挑战赛——初赛(2) A 美素数(hdu 4548)
- HDU 2516 取石子游戏(巴什博弈)
- HDU 2176 取(m堆)石子游戏(Nim game)
- HDU 2516 取石子游戏 [斐波那契博弈]
- HDU 2516 取石子游戏
- hdu 1281 棋盘游戏 二分匹配
- Hdu 4517 小小明系列故事——游戏的烦恼
- hdu 1527 取石子游戏 威佐夫game
- Hdu 2209 翻纸牌游戏[初识状态压缩]