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

一、思路

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的解答就很伤。于是在图书馆闭馆前的几分钟终于自己想出来了,就是一个前缀和来降低时间复杂度。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值