資料結構與演算法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
((23)-(45)) = -14
((2(3-4))5) = -10
(2((3-4)5)) = -10
(((23)-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))
最後一個測試用例有可能會超出時間限制,不要慌,多提交幾次好了