【程序人生】一维消消乐最高得分问题

【程序人生】一维消消乐最高得分问题

  • 一维消消乐最高得分问题
  • 12个球称3次问题
  • 1000瓶药10只老鼠问题
  • 结语

一维消消乐最高得分问题

一个一维数组,相邻元素如果数值相同,则可以合并为一个数(合并后得值为原始数值加一),且得分加一。求最高得分

# -*- 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只老鼠死掉
...

结语

如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。

你可能感兴趣的:(程序人生)