ccfcsp202012-2期末预测之最佳阈值(python)

文章目录

  • 一、思路
    • 1数据载入
    • 2.计算预测正确的次数
    • 3.输出答案
  • 二、源代码
  • 总结

一、思路

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

总结

ccfcsp202012-2期末预测之最佳阈值(python)_第1张图片
某学渣的悲惨经历,期间看过别人的C++、Java解答,然而C++里面各种STL里面的容器不熟悉,Java没学过看不懂,并且没有搜到python的解答就很伤。于是在图书馆闭馆前的几分钟终于自己想出来了,就是一个前缀和来降低时间复杂度。

你可能感兴趣的:(CCF,CSP,python,算法)