csp202012十二月第二题

本文介绍了一种利用两次遍历实现的排序算法,通过计算每个元素左侧0的数量和右侧1的数量来评估其位置的合理性。该算法适用于特定类型的二进制数据集,并通过实例演示了其工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/12/13 22:36
# @Author : Jzk
# @Site : 
# @File : pais2.py
# @Software: PyCharm
'''
排好序后,这个问题可以转化成左边0的个数+右边1的个数,因为左边元素肯定小于他,右边元素肯定大于他,
第一次遍历从 [0,m-1),每次出现一个0,就将下一个的阈值和num加入新的列表中,即[阈值,num]
第二次遍历从[m-1,0],每次出现一个1,num2就加1,,然后将与当前阈值对应的新列表中的num加上num2

然后对新列表li2进行排序,此时num的顺序是从小到大,
因为会出现重复阈值得分不同的情况,此时应该取较小的值

'''
m = int(input())
li = []
for i in range(m):
    li.append(list(map(int, input().split())))
# 排序
li.sort()
# li2第一项
li2 = [[li[0][0], 0]]
# 左边有多少个0,也就是预测挂科正确的个数
num = 0
a=0
# for i in range(m - 1):
#     if li[i][1] == 0 :
#         if li[i+1][0]!=li[i][0]:
#             num += 1+a
#             li2.append([num, li[i + 1][0]])
#         else:
#             a+=1
#     # 第一个是num,第二个是阈值
#             li2.append([ num,li[i + 1][0]])
#     else:
#         li2.append([ num,li[i + 1][0]])


for i in range(m-1):
    if li[i][0]!=li[i+1][0]:
        if li[i][1]==0:
            num+=1+a
            li2.append([num, li[i + 1][0]])
            a=0
        else:
            li2.append([num+a, li[i + 1][0]])
            a=0
    else:
        li2.append([num, li[i + 1][0]])
        if li[i][1]==0:
            a+=1




# 右边(包含自己)有多少个1,即预测不挂科正确的个数
num2 = 0
for i in range(m-1, -1, -1):
    if li[i][1] == 1:
        num2 += 1
    li2[i][0] += num2
# print(li2)
# 将li2排序,此时num的顺序是从小到大
li2.sort()
# print(li2)
print(li2[-1][1])
# so=set()
# li3=[]
# 去除重复的阈值,取得分小的
# for i in li2:
#     if i[1] not in so:
#         so.add(i[1])
#         li3.append(i)
# print(li3[-1][1])
# 测试用例
'''
6
0 0
1 0
1 1
3 1
5 1
7 1

'''
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值