数据结构与算法Python版第六周OJ作业

1 铺瓷砖(10分)

题目内容:

给定一个长度为N的区域,及4种不同长度的瓷砖:灰瓷砖(长为1格)、红瓷砖(长为2格)、绿瓷砖(长为3格)与蓝瓷砖(长为4格),求所有不同的铺满整个区域的方法数。

例如:当N=5时,共有15种铺满区域的方法,示意图如下:
在这里插入图片描述
输入格式:

一个自然数N

输出格式:

一行数字,表示不同的方法总数

输入样例:

5

输出样例:

15

解题思路:

和找零钱问题的思想类似,铺满长度为N的区域所有不同的方法数等于将每种瓷砖当作最后一块后铺满剩余长度的区域所有不同的方法数的和。基本结束条件:当N减去某一种瓷砖长度剩余区域长度变为0时,说明如果选用该种瓷砖就只有一种组合方法。此外利用函数值缓存来提高运行效率

程序代码:

def tile(sizeList, space, knownResults):
    if space == 0:
        return 1
    elif knownResults[space] != 0:
        return knownResults[space]
    else:
        num = 0
        for i in [t for t in sizeList if t <= space]:
            num = num + tile(sizeList, space - i, knownResults)
            knownResults[space] = num
    return num


sizeList = [1, 2, 3, 4]
space = eval(input())
knownResults = [0] * (space + 1)
print(tile(sizeList, space, knownResults))

2 分发糖果(10分)

题目内容:

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。

你需要按照以下要求,帮助老师给这些孩子分发糖果:

  1. 每个孩子至少分配到 1 个糖果。
  2. 相邻的孩子中,评分高的孩子必须获得更多的糖果。

那么这样下来,老师至少需要准备多少颗糖果呢?

输入格式:

一个列表,以文本格式的有效Python表达式给出

输出格式:

一行数字,表示满足分配条件所需的最少糖果数

输入样例:

[1,2,2]

输出样例:

4

注:可行的分配方案为1、2、1 颗糖果;第三个孩子只得到1颗糖果也满足题目条件

解题思路:

最少的分配发案就是保证每位同学都比两边评分低的同学多一颗糖果,先假设每一位同学都能分配一颗糖果,接着从前往后判断每一位同学评分是否比前一位高,如果评分比前一位高就分配比前一位多一颗的糖果,否则保持糖果不变,当遍历结束后就可以保证每位同学都比前边评分低的同学多一颗糖果,接着从后往前判断每一位同学评分是否比后一位高,如果评分比后一位高且糖果没有后一位多,就分配比后一位多一颗的糖果,否则保持糖果不变,当遍历结束后就可以保证每位同学都比两边评分低的同学多一颗糖果

程序代码:

def candy(ratings):
    sum = 0
    rewardList = [1] * len(ratings)
    for i in range(1, len(ratings)):
        if ratings[i] > ratings[i - 1]:
            rewardList[i] = rewardList[i - 1] + 1
    for i in range(len(ratings) - 2, -1, -1):
        if ratings[i] > ratings[i + 1] and rewardList[i] <= rewardList[i + 1]:
            rewardList[i] = rewardList[i + 1] + 1
    for i in range(len(ratings)):
        sum += rewardList[i]
    # print(rewardList)
    return sum


lst = eval(input())
print(candy(lst))

3 表达式按不同顺序求值(10分)

题目内容:

给定一个表达式字符串,求出按不同的求值顺序可能得到的所有结果

输入格式:

一行字符串,仅包含0-9与运算符+、-与*

注:字符串保证三种运算符左右均为数字字符

输出格式:

所有不重复的可能的结果,从小到大排序并以半角逗号","分隔

输入样例:

2*3-4*5

输出样例:

-34,-14,-10,10

注:
(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10

解题思路:

可以用递归算法解决,将每一个运算符看作运算顺序中最后一个运算符,对其两侧表达式所有的可能的结果进行运算,把结果存入集合中,该集合即为整个表达式的所有可能结果。基本结束条件:1、当没有运算符时说明表达式只有一个数,表达式所有可能结果只有该数;2、当只有一个运算符时,表达式所有可能结果只有一种,就是根据运算符对两个数进行对应运算的结果。记得在函数返回时要先对结果进行去重,这样可以节省总体的运算时间

程序代码:

def findWays(expr):
    nums, ops = [], []
    num = 0
    for c in expr:
        if '0' <= c <= '9':
            num = num * 10 + ord(c) - 48
        else:
            ops.append(c)
            nums.append(num)
            num = 0
    else:
        nums.append(num)

    def calc(nums, ops):
        if not ops:
            return [nums[0]]
        elif len(ops) == 1:
            if ops[0] == '+':
                return [nums[0] + nums[1]]
            if ops[0] == '-':
                return [nums[0] - nums[1]]
            else:
                return [nums[0] * nums[1]]
        else:
            res = []
            for i in range(len(ops)):
                for num1 in calc(nums[:i + 1], ops[:i]):
                    for num2 in calc(nums[i + 1:], ops[i + 1:]):
                        res.append(calc([num1, num2], [ops[i]])[0])

            return list(set(res))

    return calc(nums, ops)


expr = input()
a = findWays(expr)
a.sort()
print(','.join(str(i) for i in a))
发布了9 篇原创文章 · 获赞 0 · 访问量 1078

猜你喜欢

转载自blog.csdn.net/Divine0/article/details/105188631