当前位置:首页>python>华为OD机试 - 用户入网定期复评(Python)

华为OD机试 - 用户入网定期复评(Python)

  • 2026-10-11 07:18:50
华为OD机试 - 用户入网定期复评(Python)
用户开立支付账户,在开户完成后立即对用户进行一次风险模型评级,输出一个评分风险,评分范围1-100,等区间的分为5个等级,1-19为等级1,20-39为等级2,40-59为等级3,60-79为等级4,80-100为等级5,系统每天会任务对全量入网用户进行计算复评时间,输出评分给出新的风险等级。复评规则如下:
等级1每36个月重评一次。
等级2每12个月重评一次。
等级3每8月重评一次。
等级4每6个月重评一次。
等级5每3个月重评一次。
每个月固定按照30天计算下次日期,即每3个月对应下次日期为90天后,其它同理。
如果上次评级时间和本次任务时间差,超过了该等级应该重评的时间,说明上次漏评,那么该等级自动评级提升1等级,按照新的等级计算下次一定重评时间,最高为等级5.
输入描述
输入共m+1行,每行信息如下:
1.第一行为m和task_date,中间以空格分割,m表示全量用户数,task_date表示本次评级任务启动时间。
2.第2行到m+1行为m个用户信息,按顺序每个用户的信息格式为name(用户姓名),last rating-time(上次评级的时间,整数,表示从2000年1月1日起的天数),score(用户上一次的评分),以空格分割。
3.name为仅小写字母组成的字符串,字符串长度范围为[1-500]
输出描述
输出当前任务时间与上次复评时间小于等于5天的评级用户,逗号分割输出。
1.按照复评时间升序排序
2.用户复评时间一致按照姓名升序排序。
示例1
输入
1 100
zhangsan 8 87
输出
zhangsan

解题思路

本题需根据用户的上次评级时间、评分等级和当前任务时间,判断哪些用户需要进行复评(即距离理论上应复评时间不超过5天)。
核心规则:

  1. 根据评分(1-100)划分等级1~5,每个等级对应不同的复评周期(月转天,每月30天)。

  2. 若上次评级到当前任务时间的时间差 超过 该等级应复评周期,则等级自动提升1级(不超过5级),并重新计算应复评时间。

  3. 应复评时间 = 上次评级时间 + 当前等级对应的周期天数。

  4. 若当前任务时间与应复评时间的差值在 [0, 5] 天内,则该用户被选中输出。

思路一:直接模拟 + 列表排序

算法步骤:

  1. 定义等级对应的周期天数(等级1~5:1080, 360, 240, 180, 90)。

  2. 根据 score 确定初始等级。

  3. 计算时间差 delta = task_date - last_time,若 delta > 周期[等级] 且等级 < 5,则等级+1。

  4. 计算应复评时间 review_time = last_time + 周期[等级]。

  5. 若 0 <= task_date - review_time <= 5,保存 (review_time, name)。

  6. 按 review_time 升序,name 升序排序,输出姓名列表。

import sysdef solve_method1():    data = sys.stdin.read().strip().splitlines()    if not data:        return    # 第一行    first = data[0].split()    m = int(first[0])    task_date = int(first[1])    # 等级周期映射(天)    period = {1: 1080, 2: 360, 3: 240, 4: 180, 5: 90}    result = []    for line in data[1:1+m]:        parts = line.split()        name = parts[0]        last_time = int(parts[1])        score = int(parts[2])        # 确定初始等级        if score <= 19:            level = 1        elif score <= 39:            level = 2        elif score <= 59:            level = 3        elif score <= 79:            level = 4        else:            level = 5        delta = task_date - last_time        # 漏评则提升一级        if delta > period[level] and level < 5:            level += 1        review_time = last_time + period[level]        # 当前时间与复评时间差在0~5天内        if 0 <= task_date - review_time <= 5:            result.append((review_time, name))    # 排序    result.sort(key=lambda x: (x[0], x[1]))    output_names = [name for _, name in result]    print(','.join(output_names))if __name__ == "__main__":    solve_method1()

思路二:使用类封装用户信息 + 生成器

算法步骤:

  • 定义 User 类,包含姓名、上次评级时间、评分,以及计算当前等级、应复评时间的方法。

  • 主程序读取数据,对每个用户调用方法判断是否满足输出条件,收集结果后排序输出。

  • 此方法更符合面向对象编程,代码结构清晰,易于扩展。

import sysclass User:    # 等级周期映射(天)    PERIOD = {1: 1080, 2: 360, 3: 240, 4: 180, 5: 90}    def __init__(self, name, last_time, score):        self.name = name        self.last_time = last_time        self.score = score    def get_level(self):        """根据评分获取等级"""        s = self.score        if s <= 19:            return 1        if s <= 39:            return 2        if s <= 59:            return 3        if s <= 79:            return 4        return 5    def get_review_time(self, task_date):        """计算应复评时间,考虑漏评提升等级"""        level = self.get_level()        delta = task_date - self.last_time        if delta > self.PERIOD[level] and level < 5:            level += 1        return self.last_time + self.PERIOD[level]    def should_output(self, task_date):        """判断当前用户是否需要在本次任务中输出"""        review_time = self.get_review_time(task_date)        diff = task_date - review_time        return 0 <= diff <= 5, review_timedef solve_method2():    data = sys.stdin.read().strip().splitlines()    if not data:        return    first = data[0].split()    m = int(first[0])    task_date = int(first[1])    users = []    for line in data[1:1+m]:        parts = line.split()        name = parts[0]        last_time = int(parts[1])        score = int(parts[2])        users.append(User(name, last_time, score))    result = []    for user in users:        ok, review_time = user.should_output(task_date)        if ok:            result.append((review_time, user.name))    result.sort(key=lambda x: (x[0], x[1]))    output_names = [name for _, name in result]    print(','.join(output_names))if __name__ == "__main__":    solve_method2()

最新文章

随机文章