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

这道题主要是要求解在每个y值时:在>=y时有几个1,<y时有几个0.

方法一(超时)

采用暴力破解,对每个数都从头数1和0的个数

def predict(y,th):
    if y<th:
        return 0
    else:
        return 1


m=int(input())
a=[0]*m
y=[0]*m
for i in range(m):
    a[i]=list(map(int,input().split()))
    y[i]=a[i][0]
y=list(set(y))
for i in range(len(y)):
    count=0
    for j in range(m):
        if predict(a[j][0],y[i])==a[j][1]:
            count+=1
    y[i]=[y[i],count]
y=sorted(y,key=(lambda x:[x[1],x[0]]),reverse=True)
print(y[0][0])

方法二(超时)

如例1的例子,当求出<3中有多少个0后,求<5中有多少0,只需求=3中有几个0.同理,求出>=5有多少1时,求>=3中有多少1,只需求=3中有几个1.
采用多个二维数组的方法,但依旧用到两层循环,导致了超时。

m=int(input())
a=[0]*m
y=[]
for i in range(m):
    a[i]=list(map(int,input().split()))
a=sorted(a,key=(lambda x:x[0]),reverse=False)
for i in range(len(a)):
    if a[i][0] not in y:
        y.append(a[i][0])
y_len=len(y)
less=[0]*y_len
more=[0]*(y_len+1)
result=[0]*y_len
less[0]=0
more[y_len]=0
index=0
for i in range(1,y_len):
    count=0
    while(a[index][0]==y[i-1] and index<m):
        if a[index][1]==0:
            count+=1
        index+=1
    less[i]=less[i-1]+count
for i in range(y_len-1,-1,-1):
    count=0
    while(a[index][0]==y[i] and index>=0):
        if a[index][1]==1:
            count+=1
        index-=1
    more[i]=more[i+1]+count
for i in range(y_len):
    result[i]=less[i]+more[i]
Max=max(result)
data=[]
for i in range(y_len):
    if Max==result[i]:
        data.append(y[i])
print(max(data))

方法三:

由于在方法二中,大体思路已经正确,只需降低时间复杂度。由于在统计数据时,用到两层循环,而内层循环存在的原因是需要对所有数据中的每个进行分析。如统计=1中的0的个数,则需要对排好序的a列表中数判断其是否y为1,而后判断是否1的result为0,因而用到两层循环。
所以考虑采用字典的形式,省去内层循环,在输入数据的时候即统计每个y中result=0的个数和=1的个数。从而降低时间复杂度。

m=int(input())
a={}
ylist=[]
data=[]
ylen=0
for i in range(m):
    y,result=list(map(int,input().split()))
    if y not in a:
        a[y]=[0,0]
        ylist+=[y]
        ylen+=1
    if result==0:
        a[y][0]+=1
    else:
        a[y][1]+=1
ylist.sort()
lesslist=[0]*ylen
alllist=[0]*ylen
lesslist[ylen-1]=a[ylist[ylen-1]][1]
for i in range(ylen-2,-1,-1):
    temp=lesslist[i+1]+a[ylist[i]][1]
    lesslist[i]=temp
for i in range(1,ylen):
    temp=alllist[i-1]+a[ylist[i-1]][0]
    alllist[i]=temp
for i in range(ylen):
    alllist[i]+=lesslist[i]
Max=max(alllist)
for i in range(ylen):
    if alllist[i]==Max:
        data+=[ylist[i]]
print(max(data))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值