蓝桥杯 Python 组省赛夺奖班-5.1 排序

一、排列字母

题目

请添加图片描述

思路

模拟

代码

n = "WHERETHEREISAWILLTHEREISAWAY"
print("".join(sorted(n)))

二、统计数字

题目

请添加图片描述

思路

利用字典记录出现数字出现次数

代码

##import functools
n = int(input())
a = dict()
b = []
for i in range(n):
    t = int(input())
    if t in a.keys():
        a[t] += 1
    else:
        a[t] = 1
        b.append(t)
##def mycmp(x,y):
##    if a[x] > a[y]:
##        return 1
##    elif a[x] <a[y]:
##        return -1
##    else:
##        return 0
b.sort()
for i in b:
    print(i,a[i])

三、错误票据

题目

请添加图片描述

思路

前后差值为1正常,差值为2是缺失,差值为0是重复

代码

n = int(input())
a = []
for i in range(n):
    a.extend(list(map(int,input().split())))
a.sort()
for i in range(1,len(a)):
    if a[i]-a[i-1] == 0:
        surplus = a[i]
    if a[i]-a[i-1] == 2:
        absent = a[i]-1
print(absent,surplus)


四、奖学金

题目

请添加图片描述
请添加图片描述
请添加图片描述

思路

  1. 三次排序,先学号,再语文成绩,再总分
  2. 利用functools.cmp_to_key(),然后自己编写二元函数mycmp()自己定义“大”“小”

代码

三次排序
n = int(input())
a = [0]*n
for i in range(n):
    temp = list(map(int,input().split()))
    a[i] = [i+1,sum(temp),temp[0]]
a.sort(key = lambda x:x[0])
a.sort(key = lambda x:x[2],reverse = True)
a.sort(key = lambda x:x[1],reverse = True)
for i in range(5):
    print(a[i][0],a[i][1])

自定义key
import functools
n = int(input())
a = [0]*n
def mycmp(x,y):
    if x[1] != y[1]:
        if x[1] > y[1]:
            return 1
        else:
            return -1
    elif x[2] != y[2]:
        if x[2] > y[2]:
            return 1
        else:
            return -1
    else:
        if x[0] < y[0]:
            return 1
        else:
            return -1
for i in range(n):
    temp = list(map(int,input().split()))
    a[i] = [i+1,sum(temp),temp[0]]
a.sort(key = functools.cmp_to_key(mycmp),reverse = True)
for i in range(5):
    print(a[i][0],a[i][1])

五、双向排序

题目

请添加图片描述

思路

暂无,等学到后面回来补坑

代码

##暂无,等学到后面回来补坑

六、第几个幸运数字

题目

请添加图片描述

思路

1.模拟
这里直接模拟需要注意的事情挺多的,sort()位置不同结果截然不同,差之毫厘,谬以千里!

import sys
a = [3,5,7]
k = 0
while True:
    for i in range(3):
        temp = a[k]*a[i]
        if temp not in a:
            a.append(temp)
        ## 下面的if语句如果写成 if temp > 2**50:将会是一个灾难!
        if temp > 2**100:
            a.sort()
            print(a.index(59084709587505)+1)
            sys.exit(0)
    k += 1

如果sort()位置提到前一个判断呢?

import sys
a = [3,5,7]
k = 0
while True:
    for i in range(3):
        temp = a[k]*a[i]
        if temp not in a:
            a.append(temp)
            ## sort()放到这里了!
            a.sort()
        ## 现在不会是一个灾难,为啥呢?φ* ̄0 ̄
        if temp > 2**50:
            print(a.index(59084709587505)+1)
            sys.exit(0)
    k += 1

2^50 到2^100?
这是因为如果再每次插入时就进行排序,这样可以保证下一次生成新的数字相对会是升序,而不是有时升有时降,这时只要大于2**50就可以保证前面的数字生成完了,不过在中间有点疑惑,就是每次都是从a[k]生成,那么会不会因为排序后打乱了呢?我感觉不会,可能是这发展速度太快了,一个变三个。
2 暴力搜
这个就是无脑生成然后搜索,感觉这个更靠谱,还是这个好( ̄▽ ̄)

代码

模拟
import sys
a = [3,5,7]
k = 0
while True:
    for i in range(3):
        temp = a[k]*a[i]
        if temp not in a:
            a.append(temp)
            ## sort()放到这里了!
            a.sort()
        ## 现在不会是一个灾难,为啥呢?φ* ̄0 ̄
        if temp > 2**50:
            print(a.index(59084709587505)+1)
            sys.exit(0)
    k += 1
暴力搜
cnt = 0
for i in range(50):
    for j in range(50):
        for k in range(50):
            a = 3**i
            b = 5**j
            c = 7**k
            if a*b*c <= 59084709587505:
                cnt += 1
print(cnt-1)

附加题:

小明的衣服

题目

在这里插入图片描述

思路

哈夫曼树,是的没错,就是这个思想,你可把每次去染色看成一个类别被分离出来,不断二分,相对的可以认为运费越高就是编码出现的频率越高、越重要,那么相对的它在哈夫曼树的深度越浅。

代码

## 后面补坑
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值