1. 程式人生 > 其它 >資料結構與演算法Python版-第六週作業

資料結構與演算法Python版-第六週作業

1. 鋪瓷磚(10分)

題目內容:
給定一個長度為N的區域,及4種不同長度的瓷磚:灰瓷磚(長為1格)、紅瓷磚(長為2格)、綠瓷磚(長為3格)與藍瓷磚(長為4格),求所有不同的鋪滿整個區域的方法數。

例如:當N=5時,共有15種鋪滿區域的方法,示意圖如下:
在這裡插入圖片描述

輸入格式:
一個自然數N

輸出格式:
一行數字,表示不同的方法總數

輸入樣例:
5

輸出樣例:
15

時間限制:500ms記憶體限制:32000kb

def tile(sizelist, space, knownresult):
    num = 0
    if space == 0:
        return 1
    elif knownresult[
space] != 0: return knownresult[space] else: for i in [t for t in sizelist if t <= space]: num = num + tile(sizelist, space - i, knownresult) knownresult[space] = num return num sizelist = [1, 2, 3, 4] space = eval(input()) knownresult = [0] * (space +
1) print(tile(sizelist, space, knownresult))

2. 分發糖果(10分)

題目內容:
老師想給孩子們分發糖果,有 N 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。

你需要按照以下要求,幫助老師給這些孩子分發糖果:
每個孩子至少分配到 1 個糖果。
相鄰的孩子中,評分高的孩子必須獲得更多的糖果。
那麼這樣下來,老師至少需要準備多少顆糖果呢?

輸入格式:
一個列表,以文字格式的有效Python表示式給出

輸出格式:
一行數字,表示滿足分配條件所需的最少糖果數

輸入樣例:
[1,2,2]

輸出樣例:
4

注:可行的分配方案為1、2、1 顆糖果;第三個孩子只得到1顆糖果也滿足題目條件

示例程式碼模板:

def candy(ratings):
    # code here
    pass

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

時間限制:500ms記憶體限制:32000kb

def candy(ratings):
    sum = 0
    length = len(ratings)
    c_list = [1 for i in range(length)] # 初始化列表,確保每個孩子都有糖
    for i in range(1,length):
        if ratings[i] > ratings[i-1]:
            c_list[i] = c_list[i-1] + 1
    for i in range(length-2, -1, -1):
        if ratings[i] > ratings[i+1] and c_list[i] <= c_list[i+1]:
            c_list[i] = c_list[i+1] + 1
    for i in range(length):
        sum += c_list[i]
 
    return sum
 
lst = eval(input())
print(candy(lst))

3. 表示式按不同順序求值(10分)

題目內容:
給定一個表示式字串,求出按不同的求值順序可能得到的所有結果

輸入格式:
一行字串,僅包含0-9與運算子+、-與*
注:字串保證三種運算子左右均為數字字元

輸出格式:
所有不重複的可能的結果,從小到大排序並以半形逗號","分隔

輸入樣例:
23-45

輸出樣例:
-34,-14,-10,10

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

示例程式碼模板:

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)

    # code here

expr=input()
print(findWays(expr))

時間限制:500ms記憶體限制:32000kb

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 oper(num1, num2, op):
        if op == "+":
            return num1 + num2
        elif op == "-":
            return num1 - num2
        elif op == "*":
            return num1 * num2
    
    # 遍歷計算
    def calc(start, end):
        if start == end:
            return [nums[start]]
        # 拆分計算
        temp = []
        for i in range(start, end):
            for a in calc(start, i):
                for b in calc(i + 1, end):
                    temp.append(oper(a,b,ops[i]))
        return temp
    res = calc(0, len(nums)-1)
    res = list(set(res))
    res.sort()
    return res

expr=input()
a = findWays(expr)
print(",".join(str(i) for i in a))

最後一個測試用例有可能會超出時間限制,不要慌,多提交幾次好了