一、思路
1数据载入
用列表和字典装数据,列表装所有不重复的y值,字典形式如{y:[m,n]},m表示0的个数,n表示1的个数。
2.计算预测正确的次数
分为两个部分,一个部分是求比它小的预测正确的次数,另外一个部分是求大于等于它的预测正确的次数。其中求比它小的预测正确实质上就是比它小的数的0的个数,求大于等于它的预测正确实质上就是大于等于它的数的1的个数,分别利用前缀和来求。两部分求完后相加得到每个数的预测正确的次数。
3.输出答案
因为预测次数最大的数可能不止一个,所以倒序遍历输出这个数。
二、源代码
m = int(input())
dic = {} #装y和result
res = [] #装不重复的y
k = 0
for i in range(m):
y,result = map(int,input().split())
if y not in dic:
dic[y] = [0,0]
if result == 0:
dic[y][0] += 1
else:
dic[y][1] += 1
res.append(y)
k += 1
else:
if result == 0:
dic[y][0] += 1
else:
dic[y][1] += 1
res.sort()
order = 0
ans = [0] #装比这个数小的数的0的个数
#利用前缀和顺序求
for i in range(1,k):
order += dic[res[i-1]][0]
ans.append(order)
order1 = 0
ans1 = [] #装比这个数大的数的1的个数
#利用前缀和倒序求
for j in range(k-1,-1,-1):
order1 += dic[res[j]][1]
ans1.append(order1)
ans1 = ans1[::-1]
#统计预测正确的个数
for i in range(k):
ans[i] += ans1[i]
max1 = max(ans)
for i in range(k-1,-1,-1):
if ans[i] == max1:
print(res[i])
break
总结
某学渣的悲惨经历,期间看过别人的C++、Java解答,然而C++里面各种STL里面的容器不熟悉,Java没学过看不懂,并且没有搜到python的解答就很伤。于是在图书馆闭馆前的几分钟终于自己想出来了,就是一个前缀和来降低时间复杂度。