由K倍动态减法联想到的一类博弈问题 HDOJ 2580
来源:互联网 发布:iphone屏幕检测软件 编辑:程序博客网 时间:2024/05/16 18:25
给一堆石子,数量为n,先取的人最多能取n - 1个,之后每次最多能取上次对手取的石子的数量的k倍
当k = 1时必败数列为(1, 2, 4, 8 ……),当n的二进制中不止一位为1时,我们每次取n的二进制的最低一非0位数量,那么对手就绝对不能取完(因为高位的是地位的至少二倍),而对手不管取x为多少,假设x的最高位1为w,那么取后剩余石子n的w位或者w以下一定有1,那么我们就又可以取最低一位1了,依次进行,只有自己才能胜利。相反n的二进制只有一位,而我们又不能取完,相当于自己不能取最后一位非0位,对手就能胜。
当k = 2时必败数列为(斐波那契数列)(1,2, 3, 5, 8……),每个n都可以用数列中的不相邻数字相加得到,假设有至少两个数字(从小到大排序)(x1, x2……)相加,我们每次取最小的x1,因为x1,x2不相邻,及x1,x2至少相隔1个数字,观察斐波那契数列:隔1数字的两个数字大的是小的的至少两倍。那么对手绝对不能取完x2,对手取完后又得到一数字n1,依次进行,最后只有可能自己拿完石子。如果n及为数列中的数字,那么该n只能由一个x1相加组成,这时候我们不能取完,及不能取走最小的数字,相当于对手的胜局。
当k = n时,我们就要构造自己的数列
首先失败点为数列array(1),最大相加能组成的为max(1)
因为前面的array【i】最多能组成max【i】,max【i 】 + 1没法由数列中的数字相加组成
我们可以新建一个点,array【i + 1】 = max 【i】+ 1,解决问题;
新加了一个节点后最大能组成的数字应该为max【j】 + array【i + 1】;
因为要满足组成数字n的所有数字(x1, x2, x3……)相差至少k倍,所以array【j】满足array【j】 * k < array【i + 1】;
我们求的是最大能表示的数字,这时候只需要j足够大就可以了
很明显,j是随着失败数列中的数字的增多而增大的,由此优化算法,避免超时
HDOJ 2580 我的代码
#include<stdio.h>__int64 max[3000001], array[3000001];int main(){__int64 n, k, i, j;int cases, ca = 0;scanf("%d", &cases);while(cases --){scanf("%I64d%I64d", &n, &k);array[0] = 0;max[1] = 1;array[1] = 1;i = 1;j = 1;while(array[i] < n){i ++;array[i] = max[i - 1] + 1;while(array[j] * k < array[i])j ++;j --;max[i] = max[j] + array[i];if(i == 100000)printf("");}if(array[i] == n)printf("Case %d: lose\n", ++ca);else{while(1){if(n == array[i]){printf("Case %d: %I64d\n", ++ca, array[i]);break;}if(n > array[i]){n -= array[i];}else{i --;}}}}return 0;}
- 由K倍动态减法联想到的一类博弈问题 HDOJ 2580
- ZOJ-3599 Game (博弈 K倍动态减法)
- K倍动态减法游戏
- hdu2486 hdu2580 poj3922 A simple stone game--K倍动态减法游戏 博弈
- Poj-3922 A simple stone game(博弈,k倍动态减法)
- HDU 2486 A simple stone game (K 倍动态减法博弈游戏,还未理解)
- 斐波那契博弈-K倍动态减法游戏(Poj-3922 A simple stone game)
- zoj3599 Game----K倍动态减法游戏
- K倍动态减法(hdu 2486)
- HDOJ 题目2486 A simple stone game(K倍动态减法游戏,模板)
- HDU 2580 a simple stone game K倍减法博弈游戏
- [K倍动态减法问题] HDU 2486 & HDU2580 & POJ3922 a simple stone game
- HDU 2486 (HDU 2580, POJ 3922) A simple stone game K倍动态减法游戏
- HDU A simple stone game [K倍动态减法游戏]
- hdu2486 A simple stone game K倍动态减法游戏
- k倍动态减法(poj 3922 && zoj 3599)
- K倍动态减法游戏 HDU 2486&&POJ 3922
- (k倍动态减法游戏)zoj 3599 hdu 2486
- heap-sort-源码-堆排序
- UITextView中实现placeholder的方法
- Android实现推送方式解决方案
- HTMLParser-简单HTML和XHTML解析
- HBase HMaster启动和停止
- 由K倍动态减法联想到的一类博弈问题 HDOJ 2580
- 树莓派实验七: 轮盘游戏机
- 软工实验报告
- Windows多线程程序设计之线程同步分析(结合互斥对象)(中)
- 树莓派作品2_莫尔斯电码
- 如何设置xcode中的Base SDK 和 iOS Deployment Target ?
- Asp.net总结(一)
- 代码和数据的拼接
- Android中有多种方法可以实现其他线程与Main线程通讯