小明所在的班级共有 20 名男生,要参加学校举办的拔河比赛,赛前根据体重分成 AB 两组进行训练,要求每组 10 人, 且每组男生的体重之和尽量接近。小明设计了如下算法:
①初步分组:将所有男生按体重从高到低排序,并以 ABAB…进行初步分组;
②计算体重差: 计算每组对应两个男生的体重差;
③交换学生:按体重差从高到低判断是否交换学生。
例如 20 名男生的体重(单位: kg)从高到低为:
95, 93, 93, 90, 90, 90, 84, 83, 83, 78, 77, 75, 74, 69, 64, 61, 61, 60, 56, 55。
步骤 | 体重 | 体重和 |
初步分组 | A 组 | 95 | 93 | 90 | 84 | 83 | 77 | 74 | 64 | 61 | 56 | 777 |
B 组 | 93 | 90 | 90 | 83 | 78 | 75 | 69 | 61 | 60 | 55 | 754 |
体重差 | 2 | 3 | 0 | 1 | 5 | 2 | 5 | 3 | 1 | 1 | 23 |
交换学生 | 否 | 否 | 否 | 是 | 是 | 否 | 是 | 否 | 否 | 否 | |
最终分组 | A 组 | 95 | 93 | 90 | 83 | 78 | 77 | 69 | 64 | 61 | 56 | 766 |
B 组 | 93 | 90 | 90 | 84 | 83 | 75 | 74 | 61 | 60 | 55 | 765 |
小明按照以上算法编写Python程序如下,请在划线处填入合适的代码。
def group(student): #初步分组
a=[];b=[]
i=0
while i<len(student):
a.append(student[i])
b.append(student[i+1])
return a,b
def cal_diff(a,b): #计算体重差并降序排序
d=[]
for i in range(len(a)):
d.append([i,a[i]-b[i]])
for i in range(len(d)-1):
for j in range(0,len(d)-i-1):
if :
d[j],d[j+1]=d[j+1],d[j]
return d
def change(d,a,b): #标记是否交换
k=(sum(a)-sum(b))//2
f=[0]*len(d)
ssum=0
for i in range(len(d)):
ssum+=d[i][1]
if ssum>k:
ssum-=d[i][1]
else:
if ssum==k:
break
return f
student=[95, 93, 93, 90, 90, 90, 84, 83, 83, 78, 77, 75, 74, 69, 64, 61, 61, 60, 56, 55]
qA,qB=group(student)
print("初步分组后 A 组体重: ",qA,"和为:",sum(qA))
print("初步分组后 B 组体重: ",qB,"和为:",sum(qB))
diff=cal_diff(qA,qB)
flag=
for i in range(len(flag)): #交换
if flag[i]==1:
qA[i],qB[i]=qB[i],qA[i]
print("交换后 A 组体重:",qA,"和为:",sum(qA))
print("交换后 B 组体重:",qB,"和为: ",sum(qB))