Me, python, optimize 2, EDU44_C

Posted on 2021-11-19  144 Views


学习一个,im angry!
这次的edu比赛,本以为是送分题,结果又只做了一道。。。果然还是做div3才能提高自信
不过呢,也能借此学到很多东西,新的语法,多多练习,熟练,也当是一种提高吧
以后每次做题前,都应该花10分钟构思一下整个program的结构,提前想好,也不至于操作
的时候一阵慌乱。开局先把input,变量都声明,不要写太多废语句,多打print来检查程序
运行状态

# 老版,错的
[n,k,l] = [int(x) for x in input().split()]
a = [int(x) for x in input().split()]          #input写的很霸气
import bisect
s = 0                                          #最终要求的,先写出来
a = sorted(a)                                  #排序,很多题都要用到
b = bisect.bisect_right(a,a[0]+l)              #这个检索语句还是得好好掌握,用熟了很好用
c = len(a) - 1                                 #干嘛呢?没必要
if b > n:                                      #完全可以把 > 和 = 写成一种情况
    a1 = a[:b]                                 #排序了之后,从这个里面扣的依次就是最小满足的情况(暂时
    for i in range(b-1,b-n-1,-1):              #这个循环是没有错滴
        k = a1.pop()                           #扣
        if c >= b:                             #判断b后面的组有没有扣完,这里写错了,应该先整个av出来,算出b后面可用(扣)的个数
            p = a.pop()                        #扣
            c = c - 1                          #扣了-1,这里写的还行,思维是有了
        else:
            p = a1.pop()   
        s = s + min(k,p)                       #其实最后根本不用比大小,扣完事了,扣得正确,扣下来的全是最后要找的
    print(s)
elif b == n:
    for i in range(0,n):
        s = s + a[i]
    print(s)
else:
    print(0)                                   #最好写的部分,但是也是要判断滴  

学习一个,im angry!

#优化过的完美程序
[n,k,l] = [int(x) for x in input().split()]
a = [int(x) for x in input().split()]
import bisect
s = 0
a = sorted(a)
b = bisect.bisect_right(a,a[0]+l)
a1 = a[:b]
tot = n * k
av = tot - b
if b >= n:
    for i in range(b-1,b-n-1,-1):
        m = a1.pop()
        for j in range(0,k-1):
            if av > 0:
                av = av - 1
            else:
                m = a1.pop()
        s = s + m
    print(s)
else:
    print(0)