MOOC数据结构与算法Python版-第六周编程作业

1 铺瓷砖(10分)

题目内容:

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

例如:当N=5时,共有15种铺满区域的方法,示意图如下:

 

输入格式:

一个自然数N

 

输出格式:

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

 

输入样例:

5

 

输出样例:

15

时间限制:500ms内存限制:32000kb

程序代码1:

def dfs(N):
    if N == 0:
        return 0
    if N == 1:
        return 1
    if N == 2:
        return 1 + dfs(N-1)
    if N == 3:
        return 1 + dfs(N-1) + dfs(N-2)
    if N == 4:
        return 1 + dfs(N-1) + dfs(N-2) + dfs(N-3)
    else:
        return dfs(N-1) + dfs(N-2) + dfs(N-3) + dfs(N-4)
N = int(input())
print(dfs(N))

程序代码2: 

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. 每个孩子至少分配到 1 个糖果。

  2. 相邻的孩子中,评分高的孩子必须获得更多的糖果。

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

 

输入格式:

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

 

输出格式:

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

 

输入样例:

[1,2,2]

 

输出样例:

4

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

 

示例代码模板

 

  1. def candy(ratings):
  2.     # code here
  3.     pass
  4.  
  5. lst = eval(input())
  6. 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与运算符+-*

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

 

输出格式:

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

 

输入样例:

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. def findWays(expr):
  2.     # 用于将字符串转为数字与运算符,供参考
  3.     nums, ops = [], []

  4.     num = 0
  5.     for c in expr:
  6.         if '0' <= c <= '9':
  7.             num = num * 10 + ord(c) - 48
  8.         else:
  9.             ops.append(c)
  10.             nums.append(num)
  11.             num = 0
  12.     else:
  13.         nums.append(num)
  14.  
  15.     # code here
  16.  
  17. expr=input()
  18. print(findWays(expr))

 

时间限制:500ms内存限制:32000kb

程序代码:

class Solution():
    def findWays(self, 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]]
            if len(ops) == 1:
                if ops[0] == '+':
                    return [nums[0] + nums[1]]
                elif ops[0] == '-':
                    return [nums[0] - nums[1]]
                else:
                    return [nums[0] * nums[1]]
            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 res

        return calc(nums, ops)

l = input()
s = Solution()
a = (list(set(s.findWays(l))))
a.sort()
print(",".join(str(i) for i in a))

可惜这个用例5超时,还得改进。

 

 

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suxiaorui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值