CCF202012-2 期末预测之最佳阈值 前缀和算法python实现

if __name__ == "__main__":
    listArray = []      # 存放成绩与挂科的成对数据
    ySet = set()        # 集合用于去重
    n = int(input())   

    sum = [0 for i in range(n + 1)]     
    #前缀和数组(为什么下标范围是[1, n]?
    #答:习惯计数法。表示前n项的和
    #tips: 初始化下标0对应的值为0,方便之后累加计算sum[1] = sum[0] + 【第一项数据的成绩】

    # 存放数据
    for i in range(n):
        y, flag = map(int, input().split())
        listArray.append((y, flag))

    # 排序。按照成绩(二维数组listArray中每个一维数组的第一个元素)排序
    listArray = sorted(listArray, key = lambda x : x[0])

    # 计算前缀和
    for i in range(1, n + 1):
        sum[i] = sum[i - 1] + listArray[i - 1][1]

    # 设置临时变量
    maxMatch = -1   # 最大匹配数
    maxSuitable = -1    # 最合适的成绩
    for i, pair in enumerate(listArray):
        if(pair[0] in ySet):    # 集合去重。如果成绩重复则不讨论这对数据
            continue
        ySet.add(pair[0])       # 将不重复的成绩加入集合
        one = sum[n] - sum[i]   
        zero = i - sum[i]       
        total = zero + one
        if(total >= maxMatch):
            maxMatch = total
            maxSuitable = pair[0] 

    print(maxSuitable)


参考博客:
https://blog.csdn.net/qq_42136832/article/details/112544430#comments_14625316

你可能感兴趣的:(python,ccf)