算法石子
算法训练 石子 游戏
问题描述
石子 游戏 的规则如下:
地上有n堆石子,每次操作可选取两堆石子(石子个数分别为x和y)并将它们合并,操作的得分记为(x+1) (y+1),对地上的石子堆进行操作直到只剩下一堆石子时停止 游戏 。
请问在整个 游戏 过程中操作的总得分的最大值是多少?
输入格式
输入数据的第一行为整数n,表示地上的石子堆数;第二行至第n+1行是每堆石子的个数。
输出格式
程序输出一行,为 游戏 总得分的最大值。
样例输入
10
5105
19400
27309
19892
27814
25129
19272
12517
25419
4053
样例输出
15212676150
数据规模和约定
1 n 1000,1 一堆中石子数 50000
思路:
运用贪心算法思想,每次都取石子数量最多和第二多的两堆石子进行合并操作(进行排序操作后取前两个数),即可得到每次操作的得分为最大,最后再将每次的操作得分最大值相加求和即可得到整个 游戏 过程中操作的总得分的最大值。
代码:
欢迎大家采纳和指正!
更多内容请持续关注该账号或CSDN的 RuthlessL!
❷ 数学(取石子游戏)
每次取的数量有没有限制啊?如果没有限制,第一步取哪一堆都没有关系,只要把它全部取走,然后,无论乙取哪一堆,甲也取哪一堆,而且,让这一堆只剩下一颗;如果乙已经取到只剩下一颗了,甲就取其他的,并且取到只剩下一颗;如果乙将一堆全部取走,甲也将另一堆全部取走.甲只要记得:保留偶数堆和做到每堆只剩一颗,有了这样的策略,最后结果就会出现偶数堆,而且每堆只剩一颗,轮到乙取,最后一颗就一定是甲得的.
❸ 石子重量折方量的算法
石子的堆积密度不一,一般是1.5吨/方左右。
重量(吨)÷1.5=体积(方)
❹ 石子合并问题C语言求优秀算法
用动态规划
注意:石子合并问题和最优二叉树是不同的。
我们先考虑求最大分值。
用a数组存放原来N堆石子的初始数量,下标从0开始。
每一次合并是对现在的某两堆相邻石子的,而这相当于将初始时的的若干堆石子合并。
用b[i,j]表示将从初始的第j堆石子开始,循环向后共i堆石子合并的最大分值。(第N-1堆石子后面是第0堆)
假设最后一次是前k堆合并成的一堆和剩下的i-k堆石子合并成的一堆进行合并。所以总分值就是:这两堆各自合并的总得分 加上 最后一次全部合并的得分。
状态转移方程b[i,j]=max{ b[k,j]+b[i-k,(j+k) mod N] | k=1..i-1 } + a[j] +…+ a[(j+i-1) mod N]b[1,i]=0, i=0..n-1
最后,解就是b[N,0]到b[N,N-1]中的最大值。
❺ 石子合并问题C语言求优秀算法
先将石头求和再除2得m,求<=m得那一堆石头,再用背包法(动态规划思想,高效)或直接回朔搜索(20较小,也会轻松搞定)。
一般动态规划相比搜索写代码要简单多,但背包那问题涉及到内存的申请和释放等指针问题就有点列外啦,呵呵,小弟也没写,简单指导下。抛砖引玉。。。。。
❻ 30个石子分成7份,每份都是单数,怎么分
30为基数,分7份,每份为单数,30以内单数为15个。其中最小的7个单数是
1
3
5
7
9
11
13
和为49!