如何处理俱乐部志愿二维数组:元素超上限时转至下一列
志愿分配系统高效实现方案
核心需求梳理
- 输入:N行3列的志愿数组,每行对应1个申请者的第一、第二、第三志愿
- 规则:每个俱乐部有固定名额上限(如7),当目标俱乐部名额已满时,将申请者的志愿向下切换一档(第一→第二→第三)
- 特殊要求:优先统计已处理申请者的第二/第三志愿占用的名额,再处理后续申请者的第一志愿
- 输出:处理后数组的第一列转置结果(即所有申请者最终调整后的第一志愿列)
高效实现思路
采用字典实时跟踪俱乐部名额的方式,所有查询、更新操作均为O(1)复杂度,整体时间复杂度为O(N)(N为申请者数量),适合大规模数据处理。以下提供两种符合需求的实现:
实现1:按申请者顺序逐个处理(常规志愿逻辑)
逐个处理每个申请者,优先尝试其第一志愿,名额满则切换至第二/第三志愿,实时更新俱乐部名额:
from collections import defaultdict def process_volunteers(volunteers, quota=7): club_counts = defaultdict(int) # 跟踪每个俱乐部已占用名额 adjusted_volunteers = [] # 存储每个申请者调整后的志愿列表 for vol in volunteers: adjusted = vol.copy() # 尝试第一志愿 if club_counts[vol[0]] < quota: club_counts[vol[0]] += 1 # 第一志愿满额,切换至第二志愿 elif club_counts[vol[1]] < quota: club_counts[vol[1]] += 1 adjusted[0] = vol[1] # 第一列替换为第二志愿 adjusted[1] = vol[2] # 第二列替换为第三志愿 # 第二志愿满额,切换至第三志愿 elif club_counts[vol[2]] < quota: club_counts[vol[2]] += 1 adjusted[0] = vol[2] # 第一列替换为第三志愿 adjusted[1] = vol[2] adjusted_volunteers.append(adjusted) # 提取处理后第一列的转置结果 first_column_result = [row[0] for row in adjusted_volunteers] return first_column_result
实现2:优先处理第二/第三志愿(符合特殊要求)
先批量处理所有申请者的第二、第三志愿,占满名额后再处理第一志愿,严格遵循“优先统计第二/第三志愿”的要求:
from collections import defaultdict def process_volunteers_prioritize_low(volunteers, quota=7): club_counts = defaultdict(int) # 第一步:先分配所有第二志愿的名额 for vol in volunteers: if club_counts[vol[1]] < quota: club_counts[vol[1]] += 1 # 第二步:再分配所有第三志愿的名额 for vol in volunteers: if club_counts[vol[2]] < quota: club_counts[vol[2]] += 1 # 第三步:处理第一志愿,剩余名额分配 adjusted_volunteers = [] for vol in volunteers: adjusted = vol.copy() if club_counts[vol[0]] < quota: club_counts[vol[0]] += 1 elif club_counts[vol[1]] < quota: club_counts[vol[1]] += 1 adjusted[0] = vol[1] adjusted[1] = vol[2] elif club_counts[vol[2]] < quota: club_counts[vol[2]] += 1 adjusted[0] = vol[2] adjusted_volunteers.append(adjusted) first_column_result = [row[0] for row in adjusted_volunteers] return first_column_result
使用示例
# 测试输入:5个申请者的志愿数组 test_volunteers = [ [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3] ] # 调用函数,配额设为3 result = process_volunteers(test_volunteers, quota=3) print(result) # 输出:[1,1,1,2,2]
内容的提问来源于stack exchange,提问作者Ammar Aldabbagh
相关产品推荐
相关产品推荐

