ccf认证(期末预测之最佳阈值)前缀和(2021-09-14)

记录一下自己练过的题: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次,简便很多。

(第一次发帖,格式和规矩可能不太完善,各位谅解,欢迎交流)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值