📌  相关文章
📜  门| Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|第 63 题(1)

📅  最后修改于: 2023-12-03 15:28:46.679000             🧑  作者: Mango

这是一道来自 Sudo GATE 2020 Mock III 的编程题,题目编号为 63。该题给定一组门的坐标,要求统计出其中有多少个门是在其它门的左上方或右上方。

输入格式

程序接收一个正整数 n,表示门的数量。接下来 n 行,每行为两个正整数 x 和 y,表示第 i 扇门的坐标位置。

输出格式

程序输出一个整数,表示在其它门的左上方或右上方的门的数量。

算法思路

因为要查找门的方向,因此需要对门进行排序。可以按照门的横坐标从小到大排序,当横坐标相同时按照纵坐标从小到大排序。排序完成后,遍历所有门,对于每一扇门,查找在其左上方或右上方的门数量。

首先定义一个计数器 count 初始化为 0,表示在其它门的左上方或右上方的门的数量。

从第一扇门开始遍历,计算它左上方或右上方有多少扇门。因为门已经按照横坐标排序,所以从当前门的下一扇门(即下标为 i+1)开始查找,如果该门出现在当前门的左上方或右上方,则将计数器 count 加 1。由于已经排序,因此可以直接通过坐标关系判断是否在其左上方或右上方。

最终的计数器 count 就是所求的答案。

代码片段
def count_upper_doors(n, doors):
    doors = sorted(doors, key=lambda d: (d[0], d[1]))
    count = 0

    for i in range(n-1):
        for j in range(i+1, n):
            if doors[i][1] > doors[j][1] and doors[i][0] > doors[j][0]:
                count += 1

    return count

本函数接收两个参数,n 表示门的数量,doors 表示门的坐标列表。首先按照横坐标从小到大排列,然后遍历所有门,计算在左上方或右上方的门的数量。最终返回数量。

由于代码本身较简单,因此无需详细解释。