Description
xxx 吃鸡成瘾。为此他决定逃课吃鸡!但是学校有规定,旷课到一定次数,是不给予期末考的资格的。因此 xxx 决定每门课最多逃两次。现在告诉你,一个学期有 n 节课程,第 i节课的科目是 si,时间为 ti。你需要告诉 xxx 这个学期他逃课吃鸡的最大时间是多少。
Input
第一行给出一个整数n(1≤n≤10000)为该学期课程节数。接下来n行,第i+1行给出第i节课的科目si和时间ti中间用空格隔开si由小写字母组成1≤∣si∣≤10,1≤ti≤10000。若 si=sj则认为第i节课和第j节课是同一门课。
Output
输出xxx该学期逃课吃鸡的最大时间。
Sample Input 1
7
english 2
english 1
math 3
english 3
cook 5
eatchicken 10
cook 5
Sample Output 1
28
python思路
字典做法
- 可以想到使用字典,以科目作为键,以存储科目时间的子列表作为值
- 每输入一个科目,如果字典中已有这门科目,就把时间放到其对应的时间列表中。如果没有就在字典中添加此科目的映射。
- 最后遍历字典中的所有时间列表,如果列表长度大于等于3,则加上最长的两节,如果小于3,直接用sum函数求和即可
n = int(input())
d = {} #字典
for i in range(n):
sub, time = input().split()
if sub not in d: #如果这门课不在字典中
d[sub] = [int(time)]
else: #这门课已经在字典中
d[sub].append(int(time))
ans = 0
for i in d: #遍历字典
if len(d[i]) >= 3: #这门课的课程数大于等于3
d[i].sort() #排序
ans += d[i][-2] + d[i][-1]
else: #课程数小于3
ans += sum(d[i])
print(ans)
二维列表做法
- 可以想到生成两个列表,一个用于存放科目(subject)的列表l,一个用于存放时间(time)的列表m。
- time列表m中建立每个科目对应的子列表。遍历每一个输入的科目,如果subject列表l中已经有此科目,就把时间放到time对应的子列表中,如果没有此科目就分别在sub列表和time列表中加入科目和时间。
- 最后遍历time列表中的子列表,判断子列表中元素是否大于等于3。如果大于等于3,排序后取最大的两个,如果小于3,直接用sum函数。
n = int(input())
l = [] #用于存放科目
m = [] #用于存放时间
for i in range(n):
sub, time = input().split()
if sub not in l: #如果这门课不在l列表中
l.append(sub)
m.append([int(time)])
elif sub in l: #这门课已经在l列表中
m[l.index(sub)].append(int(time))
ans = 0
for h in m: #遍历每门科目的上课时间
if len(h) >= 3: #这门课的课程数大于等于3
h.sort()
ans += h[-2] + h[-1]
else: #课程数小于3
ans += sum(h)
print(ans)