数组+算法综合一
班级
姓名
1.【202212精诚】某校开设了10门选修课,用编号1~10表示。学校根据每位学生的问卷调查得分及选课报
名志愿进行分班,每班(即每门课)最多30人。如某同学的报名志愿表为4,1,2,7,3,5,8,10,9,6,表示他
最想选报的课编号是4(第一志愿),其次为1(第二志愿),以此类推。
选修课分班方法:优先满足问卷得分最高同学的第一志愿,如果该同学第一志愿课程所报名人数已满30
人,则尝试满足他的第二志愿,第二志愿若也无法满足,则再尝试其第三志愿以此类推,直至该同学选
课成功为止
假设报名人数是n(<300),所有人都能选上选修课,且同一个学生的十个志愿都是不同的(不会重复选
报同一个课程)。部分学生的选报情况如下表所示,数据已按学号升序排序。
AA
K
L
M
1序号学号
得分志愿1志愿2志愿3志愿4志愿5志愿6志愿7志愿8志愿9志愿10
2
02210101312
2
6
9
8
5
3
1
4
10
7
3
12210102
231
3
6
1
10
5
9
2
4
8
22210103
240
8
1
Y
6
3
7
10
2
5
32210104
263
5
6
3
10
2
7
4
9
8
1
2322302211413
270
5
8
9
3
6
10
2
2332312211414315
10
2
3
1
9
8
1
6
2342322211415
242
3
10
1
5
4
7
9
2
8
6
(1)若某人的报名志愿表为7,3,2,5,1,9,8,6,4,10,目前只剩编号4和6的课程未录取满,则该同学最终被录取课
程编号是
(2)以下程序先从报名表中读入学生填报的志愿数据,然后按每人的得分降序排列,同时维护好每个学生原始
的序号,以便完成后续的查询操作。程序的最后是从高分开始按志愿录取。排好序的部分数据如下图所示,
请完善程序。
a=[];n-0
352210217380610581243796
f=open("报名志愿.csv")
10322107013801058127396410
for s in f.readlines()[1:]
272210209377751094316827
#将s中的字符以“,”为分割符并转换为整型量
1972211211377473528106194
a.append(list (map(int,s.split(','))))
812210504376426531879104
a[n][1]=str(a[n][1])
822210505375581263941075
n+=1
1712211022375875436110298
#idx[]存储原序列排序后的新位置
19022112043751067419385210
idx=[i for i in range(n)]
for i in range(n-1):
k=i
for j in range(i+1,n):
if①
k=j
if k!=i:
a[i],a[k]=a[k],a[i]
idx [a[i][O]]=i
#原始序号排序后会跑到第ⅰ号位置上
b=[0]*10
for i in range(n):
for t in ai]3::
ifb[t-1]<30
b[t-1]+=1
a[i].append(t)
②数组+算法综合一
班级 姓名
1.【202212精诚】
(1)6
(2)①a[j][2]>a[k][2]
②break
(3)③index=idx[m]
④a[index][1]2.【202212四校】
(1)max2=max1
(2)max2==left1
(3)k>=m and a[i][2]!=a[i-1][2] 或 k>=5 and a[i][2]!=a[i-1][2]
(4)randint(st,k-1) 或 randint(st,len(b)-1)
3.【202212慈溪适应】
(1)4
(2)①t=int(a[:i])*60+int(a[i+1:])
②tm[j],tm[j+1]=tm[j+1],tm[j]
③i[1]>=t