【程序人生】一维消消乐最高得分问题
一维消消乐最高得分问题
一个一维数组,相邻元素如果数值相同,则可以合并为一个数(合并后得值为原始数值加一),且得分加一。求最高得分
# -*- coding:utf-8 -*-
import sys
def main(num_list):
result = []
def dfs(alist, counts):
"""
回溯算法
Args:
alist: 数值列表
counts: 得分计数
Returns: none
"""
if len(alist) > 1:
for j in range(len(alist) - 1):
# 保留当前节点的counts
counts_ = counts
if alist[j] == alist[j + 1]:
counts_ = counts_ + 1
# 保留当前节点的alist
temp_ = alist.copy()
temp_[j] = alist[j] + 1
temp_.pop(j + 1)
dfs(temp_, counts_)
result.append(counts_)
# 如果数值列表只有一个值,则无法继续
else:
result.append(counts)
return
# n个值,从第一个到第n-1个循环
for i in range(len(num_list) - 1):
count = 0
# 如果当前值和下一个值相同,则合并二者,得分加一
if num_list[i] == num_list[i + 1]:
count = count + 1
temp = num_list.copy()
temp[i] = num_list[i] + 1
temp.pop(i + 1)
dfs(temp, count)
if len(result) == 0:
result.append(0)
sys.stdout.write("{}".format(max(result)))
if __name__ == "__main__":
# 输入数组大小
nums = int(sys.stdin.readline().strip())
# 输入数组中每一个元素的值
x_list = [int(each.strip()) for each in sys.stdin.readline().strip().split(" ")]
if len(x_list) != nums:
sys.exit(0)
main(x_list)
12个球称3次问题
12个球,其中一个球质量和其他球不同,给一个无刻度得天平,称三次,找出这个质量不同的球,且得出这个球是更重还是更轻
将12个球,平均分三份,每份四个
随机取两份,第一次称重:
if 天平平衡:
坏的球在另外一份中
另外一份中的随机三个 和 三个正常的球进行第二次称重:
if 天平平衡:
坏的小球是另外一个
将坏的小球 和 随便一个球进行第三次称重:
得知坏球是轻还是重
else:
坏的球在这三个里,且得知坏球是轻还是重
在三个中随便取两个进行第三次称重:
if 天平平衡:
坏球是另一个
else:
由于得知了坏球是轻还是重,所以找到坏球
else:
坏的球在当前两份中的一份中
设当前两份分别为A1、A2、A3、A4和B1、B2、B3、B4,正常的球堆为C
在C中取出三个+A1 和 A2、A3、A4+B1 进行第二次称重:
if 天平平衡:
坏球在B2、B3、B4中,且因为第一次称不平衡,则得知坏球是轻还是重
在B2、B3、B4中随便取两个进行第三次称重:
if 天平平衡:
坏球是另一个
else:
由于得知了坏球是轻还是重,所以找到坏球
if A1边比较重:
如果第一次称重时,A边较重。则不是A1较重,就是B1较轻
将A1与任意一个好球进行第三次称重,得出结论
如果第一次称重时,A边较轻。则A2、A3、A4中,有一个较轻的球
将A2、A3、A4中任意两个进行第三个称重,得出结论
if B1边比较重:
如果第一次称重时,A边较重。则A2、A3、A4中,有一个较重的球
将A2、A3、A4中任意两个进行第三个称重,得出结论
如果第一次称重时,A边较轻。则不是A1较轻,就是B1较重
将A1与任意一个好球进行第三次称重,得出结论
1000瓶药10只老鼠问题
1000瓶药,其中一瓶有毒,只要吃了有毒的药(包括和无毒的药一起吃的情况),老鼠就会死,用10只老鼠做实验,找出哪一瓶药有毒
因为2的10次方 = 1024 > 1000,所以1000都可以表示成10位二进制的形式
则取10个碗,对应10位
第一瓶药,只在第一个碗里放一粒,因为1的10位二进制为0000000001
第二瓶药,只在第二个碗里放一粒,因为2的10位二进制为0000000010
第三瓶药,在第一个和第二个碗里各放一粒,因为3的10位二进制为0000000011
...
然后让10只老鼠各吃一碗:
第一瓶药有毒,对应:只有第10只老鼠死掉
第二瓶药有毒,对应:只有第9只老鼠死掉
第三瓶药有毒,对应:第10只和第9只老鼠死掉
...
结语
如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。