记录一下自己练过的题:ccf认证(期末预测之最佳阈值)前缀和
题目
想试试手的小伙伴可以去官网找找看
m = int(input()) #输入学生数量
test = []
for i in range(m): #录入y和result
test.append([int(x) for x in input().split()])
test.sort(key = lambda x:x[0]) #!!!先排序(很关键,直接让后面少了一个嵌套在m次循环里的循环)
k = []
j = 0
#这里挺巧妙的(由于是排好序的test,所以不需要遍历k找相同的y,只需要比较上一个test是否和此次相同即可)
for i in range(m):
if(i >= 1):
if(test[i][0] == test[i-1][0]): #比较此个学生的yi和上一个的yi是否相同,相同直接处理(加一)
if(test[i][1] == 0):
k[j-1][1] += 1
elif(test[i][1] == 1):
k[j-1][2] += 1
else: #不同则需要新录入,这里求的是前缀和
if(test[i][1] == 0):
k.append([test[i][0],1,0])
k[j][1] += k[j-1][1]
k[j][2] += k[j-1][2]
else:
k.append([test[i][0],0,1])
k[j][1] += k[j-1][1]
k[j][2] += k[j-1][2]
j += 1
else:
if(test[0][1] == 0):
k.append([test[0][0],1,0])
else:
k.append([test[0][0],0,1])
j += 1
k1 = [[0,0,0]] + k
ans = 0
accuracy = 0
sita = 0
for i in range(1,len(k1)): #后续只需通过便捷运算即可
ans = k1[len(k1)-1][2] - k1[i-1][2] + k1[i-1][1]
if(ans >= accuracy):
accuracy = ans
sita = k1[i][0]
print(sita)
贴个链接:ccf-csp认证期末预测之最佳阈值(2020年12月13日)
关键就在这句话:“本题正解思路是,对所有输入进行排序,记录比自己小的0的个数,比自己大的1的个数。”这个用前缀和很方便。
这题的关键就在于如何节省时间,节省时间最重要的就是减少循环次数,这个提升非常大。我们考量时间复杂度,如果暴力遍历,是m次循环嵌套m次循环,就是要算m**m次,指数爆炸了,现在只需要算n*m次,简便很多。
(第一次发帖,格式和规矩可能不太完善,各位谅解,欢迎交流)