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

56 篇文章 4 订阅

题目叙述

问题描述:略

输入格式:略

输出格式:略

样例

样例1输入
6
0 0
1 0
1 1
3 1
5 1
7 1

样例1输出
3

样例2输入
8
5 1
5 0
5 0
2 1
3 0
4 0
100000000 1
1 0

样例2输出
100000000

满分证明

在这里插入图片描述

解题思路

问题描述有点复杂,如果用暴力穷举会超时(只能得70分,┭┮﹏┭┮),这时候就要想如何去优化了。

最近几年的CCF考试都有从描述复杂的现实问题中抽象出简单逻辑问题的趋势;比如该题为每一个阈值正确的个数与“resulti”有直接联系,而且用前缀和思想。

如果大家之前学过前缀和思想,那这道题就很简单了(没学过的小伙伴可以点击下方的参考链接,我觉得另外一名博主讲的挺好的)。

前缀和是一种重要的预处理,能大大降低查询的时间复杂度。

  1. 前缀和是在有序数组的基础上进行;
  2. 在进行完排序,分别计算截止到每一个“yi”的正确次数(本题考查核心);
  3. 依次遍历每个阈值,寻找最大预测次数(最大预测次数=该阈值前0的个数+该阈值后1的个数);
  4. 注意遇到两个阈值相等,取最大的(通过在判断时多写一个等号即可)。

注意:
我在调试程序时发现一个问题,对排序后的list去重,变成集合后,集合并不是有序的!!!

a = [1, 4, 8, 7, 10000000, 4, 5, 4, 8]
a.sort()
print(set(a))
>>
{10000000, 1, 4, 5, 7, 8}

满分代码

m = eval(input())
yr = []
# 计算1出现的总次数
ones = 0
for _ in range(m):
    yi, ri = map(int, input().split())
    yr.append([yi, ri])
    if ri == 1:
        ones = ones + 1
# 对yr依据yi排序
yr.sort(key=lambda x: x[0])
oy = list(a[0] for a in yr)
ss = set()
acc_sum = [0 for _ in range(m)]
acc_sum[0] = yr[0][1]
f_t = 0
bes_res = 0
for i in range(1, m):
    acc_sum[i] = acc_sum[i - 1] + yr[i][1]
for ind, y in enumerate(oy):
    if y not in ss:
        ss.add(y)
        tem = sum[ind - 1]
        res = ind - tem + ones - tem
        if res >= bes_res:
            bes_res = res
            f_t = y
print(f_t)

感谢及参考博文

部分内容参考以下链接,这里表示感谢 Thanks♪(・ω・)ノ
参考博文1 前缀和(一)
https://blog.csdn.net/fgy_u/article/details/109349710
参考博文2 前缀和(二)
https://blog.csdn.net/FGY_u/article/details/109390559

需者自取传送门(∩ᄑ_ᄑ)⊃━☆【CCF 2013-2021】本博主整理历年至少前两题 python 满分代码目录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值