用户开立支付账户,在开户完成后立即对用户进行一次风险模型评级,输出一个评分风险,评分范围1-100,等区间的分为5个等级,1-19为等级1,20-39为等级2,40-59为等级3,60-79为等级4,80-100为等级5,系统每天会任务对全量入网用户进行计算复评时间,输出评分给出新的风险等级。复评规则如下:每个月固定按照30天计算下次日期,即每3个月对应下次日期为90天后,其它同理。如果上次评级时间和本次任务时间差,超过了该等级应该重评的时间,说明上次漏评,那么该等级自动评级提升1等级,按照新的等级计算下次一定重评时间,最高为等级5.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天的评级用户,逗号分割输出。解题思路
本题需根据用户的上次评级时间、评分等级和当前任务时间,判断哪些用户需要进行复评(即距离理论上应复评时间不超过5天)。
核心规则:
根据评分(1-100)划分等级1~5,每个等级对应不同的复评周期(月转天,每月30天)。
若上次评级到当前任务时间的时间差 超过 该等级应复评周期,则等级自动提升1级(不超过5级),并重新计算应复评时间。
应复评时间 = 上次评级时间 + 当前等级对应的周期天数。
若当前任务时间与应复评时间的差值在 [0, 5] 天内,则该用户被选中输出。
思路一:直接模拟 + 列表排序
算法步骤:
定义等级对应的周期天数(等级1~5:1080, 360, 240, 180, 90)。
根据 score 确定初始等级。
计算时间差 delta = task_date - last_time,若 delta > 周期[等级] 且等级 < 5,则等级+1。
计算应复评时间 review_time = last_time + 周期[等级]。
若 0 <= task_date - review_time <= 5,保存 (review_time, name)。
按 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()