哈工大2024春算法设计与分析期末考试题回忆版2024/05/19

题目pdf(五道解答题)可下载,博客部分每道题我写了自己的理解,欢迎大佬指正。

一、20分判断题,十道判断每题两分,主要考了各种算法主要思想和使用条件

二、20分问答题,四道简答题每题5分,使用master定理求递归方程时间复杂度

三、10分 最长公共子序列问题的求解复现,使用动态规划方法,写出递归方程,算法伪代码,并针对具体的输入构造代价矩阵Cij

四、10分 求解两个有序数组合并后的中位数,两个数组个数相同且均为偶数,要求写出计算过程,伪代码和时间复杂度分析。这是力扣的第四题,标记为hard,但是做了简化,力扣标答里有对数时间算法,但是考场初见估计想不出来具体操作。课上讲过median of median方法不知道能不能用。

五、12分 一道搜索算法题,很有意思。有一个大小为m*n的农田,农田中有k个水龙头,水龙头的位置和水量均给定,其余位置种满庄稼。每个水龙头可以朝东南西北四个方向沿直线喷水,四个方向的水量可能不同。为了避免淹坏或者渴坏庄稼,每个位置的庄稼完成灌溉等价于有且只有一个水龙头喷洒到该庄稼所在位置。给定农田大小、水龙头位置和水量,设计搜索算法完成合法灌溉方案,使得所有的庄稼都能得到灌溉并且所有水龙头的水量都被用完。写出算法的主要思想,搜索策略和所用数据结构。课堂例题是用优先队列和分支界限法,但是这道考题不知道怎么用,而且约束条件这么多,很可能无解吧。

六、13分 试卷分配问题。根据给定的题目数量、题目的多重类型,以及试卷的具体要求,设计一个算法来分配试卷,其中每种题目可能对应多个类型。例如题目1对应类型1,2,3,题目2对应类型2,4等等。试卷要求形如两道类型1的题,一道类型2的题,三道类型3的题等等。这道题的样例输入是15道题目对应的4个类型以及试卷对类型题的要求。应该可以用匈牙利算法求解,但是可能会比较慢。

七、15分 贪心算法问题。设计一个算法,以最少的灯泡数量照亮一个旅游景区的所有景点。景点由其水平坐标 x_i 和高度 h_i 定义,且已按 x_i 从小到大排序。所有灯泡位于同一高度 H,其水平坐标也按从小到大排列。算法需要保证每个景点都能被至少一个灯泡照亮,且灯泡与景点的连线不能与由景点形成的山脉折线相交。要求提供算法的计算过程、伪代码及时间复杂度分析。主要考虑对景点贪心还是对灯泡位置贪心,这是我后来设计的思路,并提供了伪代码,欢迎各位大佬批评指正:

算法描述:

目标:在一定高度 𝐻 放置若干灯泡,确保所有景点都被照亮,同时尽量减少灯泡的数量。

核心思想:每次迭代选择高度最低的尚未被照亮的景点,计算该景点能被照亮的灯泡位置范围。然后在这个范围内选择一个能够覆盖最多其他景点的灯泡位置。

实现步骤:

1.将景点按高度排序。

2.每次选择高度最低的顶点入队,计算该景点左右两条延长线与灯泡放置线的交点,确定灯泡的可行放置范围。

3.在可行范围内通过细致的搜索,选择一个能最大化覆盖其他景点的灯泡位置。

4.放置灯泡,并更新覆盖状态,将该景点和该灯泡出队。

5.重复上述步骤直到所有景点都被照亮。

算法伪代码:

Function illuminateScenery(scenery, H)

    scenery.sort(key=lambda point: point[1])

    lamps = []

    queue = scenery.copy()

    While queue is not empty

        current_point = queue.pop(0)

        x_i, h_i = current_point

        (left_bound, right_bound) = calculateLampBounds(x_i, h_i, H)

        best_lamp_position = findBestLampPosition(left_bound, right_bound, queue, H)

        lamps.append(best_lamp_position)

        updateQueueAndIllumination(queue, best_lamp_position, H)

    return lamps

Function calculateLampBounds(x_i, h_i, H)

    reach = abs(H - h_i)

    return (x_i - reach, x_i + reach)

Function findBestLampPosition(left, right, queue, H)

    max_coverage = 0

    best_position = left

    for position in linspace(left, right, 100)

        coverage = countCoverage(queue, position, H)

        if coverage > max_coverage

            max_coverage = coverage

            best_position = position

    return best_position

Function updateQueueAndIllumination(queue, lamp_position, H)

    for i = len(queue) - 1 to 0 step -1

        if canIlluminate(queue[i][0], queue[i][1], lamp_position, H)

            queue.pop(i)

Function countCoverage(queue, lamp_position, H)

    count = 0

    for (x, h) in queue

        if canIlluminate(x, h, lamp_position, H)

            count += 1

    return count

Function canIlluminate(x, h, lamp_position, H)

return abs(x - lamp_position) <= abs(H - h)

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值