1.13科目一专业级

第一题:部门排序

题目描述:每个部门有所在城市(city)、部门名称(departmentName)、成员数量(members)三个属性,选出每个city members前5位的department,members相同的以departmentName字典序小的优先。输出结果按city+departmentName排序。

 

题解:

纯排序题,具体步骤如下:

1. 将原始数据按city正序+members逆序+departmentName正序排序(C语言的话使用qsort+自定义compare函数实现)

2. 遍历排序后结果,将每个city members前5位的department选出保存到resultBuf

3. 由于排序策略已经保证了members相同的department字典序小的在前,因此无需考虑members相同的问题

4. 最后按city正序+departmentName正序排序resultBuf即为最终结果(C语言的话使用qsort+自定义compare函数实现)

 

 

 

 

 

 

第二题:故障自检

题目描述:给定一个图数据结构,图中每个节点分为普通节点和关键节点两种,其中某个节点发生故障,故障节点会将故障信息传递给其下所有子节点,需要自检的节点为:

1. 故障节点本身

2. 收到故障信息的关键节点

3. 收到故障信息的关键节点其上所有父节点

 

 

题解:

map构造,按原始数据分别构造一个childList(包含故障节点p的全部子节点)和一个parentMap(包含某个节点的全部父节点),其中childList的构造基于层次遍历(对于此题,只需基于故障节点p做一次层次遍历即可),parentMap的构造直接遍历原始数据即可,然后按题目描述模拟实现即可,最终结果按节点id正序排序输出。注意,建议将原始数据都以map的形式存储和访问,否则容易超时。

 

 

 

第三题:电瓶车充电

题目描述:给定电瓶车最大充电电量energyMax,现在要骑电瓶车从公司回家,途中有n个充电桩,第i个充电桩充一个energy的耗时为charges[i],第i个充电桩到第i+1个充电桩需要消耗costs[i]的电量,求最小充电时间,其中初始电量energyNow为0。

 

题解:

贪心,具体策略如下:

1. 假设在第i个充电桩充满电(i初始为0),找到充满电的情况下能到达的最远距离j(如果i==j则无法到家,返回-1)

2. 找到i+1到j充电桩中(包含i+1和j)charge最小的那个充电桩,标记为chargeMin,序号标记为chargeMinIndex

3. 比较charges[i]和chargeMin

4. 若charges[i]<=chargeMin,则直接在当前i充电桩把电量充满,然后把车子开到chargeMinIndex(即在当前节点充电最划算)

5. 若charges[i]>chargeMin,则从i开始向右遍历找到第一个charge小于i的节点j(最差情况是j==chargeMinIndex),将电量充到刚好可以到达j,然后把车子开到j(即去j充电更划算)

6. 重复上述策略,直到回家为止

 

两个边界条件处理如下:

1. 如果在第i个充电桩充满电的情况下已经足够回家,则在把energyMax改为刚好够回家的电量即可,也就是不需要再充满(保证到家时不会有电量浪费)

2. 如果i==n-1(即最后一个充电桩),则在i把电充到刚好够回家即可

PS:电瓶车扔了吧,走路回家都比这快

 
posted @ 2023-01-19 18:44  易先讯  阅读(79)  评论(0编辑  收藏  举报