首页 > 试题广场 >

基因序列分组优化

[编程题]基因序列分组优化
  • 热度指数:310 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在一个基因工程研究项目中,科学家们获得了一批基因序列样本 G_0
这批样本的数量为 N,其中 N 是一个偶数,且 1 \le N \le 500
每个基因序列都有一个整数ID,ID值可能会重复出现。

为了进行对比实验,需要将这批样本 G_0 分成两个小组:实验组 G_A 和对照组 G_B
分组必须遵循以下严格的实验标准:

1. 数量均等 : 两个小组的基因序列样本数量必须完全相等,即 |G_A| = |G_B| = \frac{N}{2}
2. 组内ID唯一性 : 在同一个小组内,所有基因序列的ID必须是唯一的。
3. 有序排列 : 输出时,两个小组内的基因序列ID都必须按升序排列。
4. 实验组复杂度最小化 : 为了确保实验结果的准确性,实验组 G_A 的“基因复杂度”(定义为组内所有ID的总和 \sum_{id \in G_A} id)必须达到最小值。

您的任务是设计一个算法,根据给定的初始样本集合 G_0,找出满足上述所有条件的最优分组方案。
如果存在这样的方案,请输出两个小组的ID列表。
如果无法找到任何满足条件的分组方案,则输出 `null`。

输入描述:
一个包含 N 个正整数的数组,代表初始基因序列样本集合 G_0 的ID列表。
数组长度 N 的范围为 [1, 500]


输出描述:
如果存在有效分组,输出两行。
第一行是实验组 G_A 的ID列表(升序),第二行是对照组 G_B 的ID列表(升序)。
ID之间用空格隔开。

如果不存在有效分组,则输出字符串 `null`。
示例1

输入

1 1 2 4 3 6

输出

1 2 3
1 4 6
示例2

输入

1 1 1 2

输出

null

备注:
本题由牛友@Charles 整理上传
# 导入模块:sys用于读取输入,Counter用于统计元素出现次数 import sys from collections import Counter def helper(nums): """ 处理基因分组的核心函数 参数nums:输入的基因ID列表(整数类型) 返回:符合要求的分组结果(字符串格式),无解则返回"null" """ n = len(nums) # 获取输入列表的长度(样本总数) count = Counter(nums) # 统计每个基因ID的出现次数(如{1:2, 3:1}) A = [] # 实验组:需要满足“组内无重复、总和最小、数量为n//2” B = [] # 对照组:需要满足“组内无重复、数量为n//2” single_ids = [] # 存储出现次数为1的ID(后续需分配到A或B) # 遍历每个ID及其出现次数,做初步分组/无解判断 for key, val in count.items(): # 若某个ID出现超过2次:无法分组(组内不能有重复) if val > 2: return "null" # 若ID出现2次:给A、B组各分配1个(保证组内无重复) if val == 2: A.append(key) B.append(key) # 若ID出现1次:暂存到single_ids,后续分配 if val == 1: single_ids.append(key) # 对“出现1次的ID”排序:方便选最小的给A组(保证A组总和最小) single_ids.sort() # 计算A组还需要的ID数量:A组总容量是n//2,已从“出现2次的ID”拿了len(A)个 need = n // 2 - len(A) # 从排序后的single_ids中,取前need个最小的ID加入A组 for _ in range(need): A.append(single_ids.pop(0)) # pop(0)取列表首个元素(最小的) # 剩下的single_ids全部加入B组 B.extend(single_ids) # 两组按升序排序(满足题目输出要求) A.sort() B.sort() # 按题目要求格式返回:A组和B组用空格分隔,两组之间换行 return " ".join(map(str, A)) + "\n" + " ".join(map(str, B)) # 读取输入(处理多组输入,每行是一组基因ID) for line in sys.stdin: line = line.strip() # 去除换行/空格 if not line: continue input_list = line.split() # 按空格分割成字符串列表 input_nums = list(map(int, input_list)) # 转成整数列表(必须,否则数值排序错误) print(helper(input_nums)) # 调用分组函数并打印结果
发表于 2025-11-09 09:32:16 回复(1)