CCF 202012-2 期末预测之最佳阈值 python

CCF 202012-2 期末预测之最佳阈值 python(100)

这道题对时间进行了限制,所以要想一次遍历得出结果,就应该思考!
样例输入

安全指数011357
挂科情况001111

思路详解 <前提–安全指数升序排列>

  1. 首先令第一个同学的安全指数0为阈值E,计算此时预测正确的次数sum为4,最大正确次数max也为4,最佳阈值record为0。
  2. 循环下一个安全指数1为阈值E。比1大的安全指数和安全指数1在阈值E等于1和0时预测结果相同,所以不需要考虑。需要考虑比1小的前一或前几个相等的数,上例只需要考虑一个数0。如果阈值E=1预测安全指数为0的预测结果与其挂科情况一致,这说明阈值E=0时对其的预测结果错误,而此时正确,所以sum+1;反之阈值E=1预测安全指数为0的预测结果与其挂科情况不一致,这说明阈值E=0时对其的预测结果正确,而此时错误,所以sum-1。sum为5,max也为5,record为1。
  3. 循环下一个安全指数1为阈值E。阈值没有变化直接跳过。
  4. 循环下一个安全指数3为阈值E。需要考虑比3小的前一或前几个相等的数,上例需要考虑两个数1。因为两个同学的安全指数相同,挂科情况未必一致。而为什么不需要继续考虑安全指数更小的0?因为阈值E等于3或者1,对于0的预测结果相同,即影响效果相同,无须重复考虑。根据上面的思路,此时sum为5,max也为5,record为3。以此类推,即可!

Python源码

def predict(y, E):
    if y >= E:
        return 1
    else:
        return 0

def count(n, num_list, E):
    sum = 0
    for i in range(n):
        if num_list[i][1] == predict(num_list[i][0], E):
            sum += 1
    return sum

if __name__ == '__main__':
    n = int(input())
    num_list = []
    for i in range(n):
        y, result = list(map(int, input().split()))
        num_list.append([y, result])

    num_list.sort(key=lambda num_list: num_list[0])

    sum = count(n, num_list, num_list[0][0])
    max = sum
    record = num_list[0][0]

    for j in range(1, n):
        if num_list[j][0] > num_list[j - 1][0]:
            z = j - 1
            while True:  # 需要考虑小于num_list[j][0]的前面几个数
                if predict(num_list[z][0], num_list[j][0]) == num_list[z][1]:
                    sum += 1
                else:
                    sum -= 1
                if z-1 < 0 or num_list[z - 1][0] != num_list[z][0]:
                    break
                z = z - 1

            if sum >= max:  # 等号是因为多个阈值均可以达到最高准确率时,选取其中最大的
                max = sum
                record = num_list[j][0]
    print(record)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值