蓝桥杯校内模拟赛Python解答

@

1. 15.125GB

【问题描述】
在计算机存储中,15.125GB是多少MB?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


1KiB(Kilobyte)=1024B ,即2的10次方字节zd,读音“千字节”
1MiB(Megabyte)=1024KiB,即2的20次方字内节,读音“兆字节”
1GiB(Gigabyte)=1024MiB,即2的30次方字节,读音“吉字节”
1TiB(Terabyte)=1024GiB,即2的40次方字节容,读音“太字节”
1PiB(Petabyte)=1024TiB,即2的50次方字节,读音“拍字节”
1EiB(Exabyte) =1024PiB,即2的60次方字节,读音“艾字节”
1ZiB(Zettabyte)=1024EiB,即2的70次方字节,读音“Z字节”
1YiB(Yottabyte)=1024ZiB,即2的80次方字节,读音“Y字节
比特(bit)是最小的存储单位。
计算机存储单位一般用字节(Byte)、千字节(KB)、兆字节(MB)、吉字节(GB)、太字节(TB)、拍字节(PB)、艾字节(EB)、泽它字节(ZB,又称皆字节)、尧它字节(YB)表示。

capacity = 15.125 * 1024

print(capacity)

15488

2. 约数个数

【问题描述】
1200000有多少个约数(只计算正约数)。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


约数,又叫因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。在自然数(0和正整数)的范围内,任何正整数都是0的约数。4的正约数有:1、2、4。6的正约数有:1、2、3、6。10的正约数有:1、2、5、10。12的正约数有:1、2、3、41215的正约数有:1、3、5、15。18的正约数有:1、2、3、6、9、18。20的正约数有:1、2、4、5、10、20。注意:一个数的约数必然包括1及其本身。

count = 2  # 1 and itself

num = 1200000

for i in range(2, num):  # From 2 to num - 1
    if num % i == 0:
        count += 1
        # print(i, end=' ')  # Show all divisors

print(count)

96

3. 叶结点数

【问题描述】
一棵包含有2019个结点的二叉树,最多包含多少个叶结点?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


最多叶子结点数就是求其对应的完全二叉树
然后求2019个结点的完全二叉树的叶子结点即可

def most_leaf_nodes(total):

    layer = 0

    while 2 ** layer - 1 < total:
        layer += 1

    now_layer = layer - 1

    now_layer_nodes = 2 ** (layer - 2)

    now_total_nodes = 2 ** (layer - 1) - 1

    left_nodes = total - now_total_nodes

    leaf_nodes = now_layer_nodes - (left_nodes // 2 + left_nodes % 2) + left_nodes

    return leaf_nodes


print(most_leaf_nodes(2019))

1010

4. 数字9

【问题描述】
在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算只是算一个数。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。



数位分离

def is_contains_9(num):
    """It's four, no need to cycle."""

    one = num % 10
    ten = num // 10 % 10
    hundred = num // 100 % 10
    thousand = num // 1000 % 10
    if 9 in [one, ten, hundred, thousand]:
        return True
    else:
        return False


ans = 0

given_number = 2019

for i in range(1, given_number + 1):
    if is_contains_9(i):
        # print(i, end=' ')  # list all eligible numbers
        ans += 1

print('\n', ans, sep='')

544

5. 数位递增的数

【问题描述】
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
30
【样例输出】
26
【评测用例规模与约定】
对于 40% 的评测用例,1 <= n <= 1000。
对于 80% 的评测用例,1 <= n <= 100000。
对于所有评测用例,1 <= n <= 1000000。


dp动态规划

def dfs(pos, pre, limit):

    if pos == -1:  # 单独一位算一个
        return 1

    if not limit and dp[pos][pre] != -1:  # 返回dp二维表中记录的值
        return dp[pos][pre]

    up = a[pos] if limit else 9

    ans = 0

    for i in range(pre, up + 1):
        ans += dfs(pos - 1, i, limit and i == a[pos])

    if not limit:  # 把算过的值记录在dp二维表中
        dp[pos][pre] = ans

    return ans


def solve(num):
    k = 0
    while num != 0:
        a[k] = num % 10
        k += 1
        num = num // 10

    return dfs(k - 1, 0, True)


a = [0 for _ in range(10)]

dp = [[-1 for _ in range(10)] for _ in range(11)]

n = int(input())

print(solve(n) - 1)

# print(a, dp, sep='\n')

当输入1000时,数组中数据记录
1000
219
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
[[10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
[55, 45, 36, 28, 21, 15, 10, 6, 3, 1],
[220, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]

6. 递增三元组

【问题描述】
在数列 a[1], a[2], ..., a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
【输入格式】
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], ..., a[n],相邻的整数间用空格分隔,表示给定的数列。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
5
1 2 5 3 5
【样例输出】
2
【样例说明】
a[2] 和 a[4] 可能是三元组的中心。
【评测用例规模与约定】
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。

按顺序比大小,用过的中心入栈,之后就不能再用了

n = int(input())

arr = list(map(int, input().split()))

count = 0

data = []

for i in range(n):
    for j in range(i + 1, n):
        for k in range(j + 1, n):
            if arr[i] < arr[j] < arr[k]:
                if arr[j] not in data:
                    data.append(arr[j])
                    count += 1
                # count += 1
                # arr[j] = 0

print(count)

7. 音节判断

【问题描述】
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
【输入格式】
输入一行,包含一个单词,单词中只包含小写英文字母。
【输出格式】
输出答案,或者为yes,或者为no。
【样例输入】
lanqiao
【样例输出】
yes
【样例输入】
world
【样例输出】
no
【评测用例规模与约定】
对于所有评测用例,单词中的字母个数不超过100。

这里直接列出了 也可以自己编一个判断函数

word = input()

vowel = ['a', 'e', 'i', 'o', 'u']

i = 0

ans = 0

if word[i] in vowel:
    print('no')
else:
    ans += 1
    i += 1
    while i < len(word):
        if word[i] not in vowel:
            i += 1
        else:
            ans += 1
            # print(ans, i)
            break

    while i < len(word):
        if word[i] in vowel:
            i += 1
        else:
            ans += 1
            # print(ans, i)
            break

    while i < len(word):
        if word[i] not in vowel:
            i += 1
        else:
            ans += 1
            # print(ans, i)
            break

    while i < len(word):
        if word[i] in vowel:
            i += 1
        else:
            ans += 1
            break

    if ans == 4:
        print('yes')
    else:
        print('no')

8. 长草

【问题描述】
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k 个月后空地上哪些地方有草。
【输入格式】
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。
【输出格式】
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
【样例输入】
4 5
.g...
.....
..g..
.....
2
【样例输出】
gggg.
gggg.
ggggg
.ggg.
【评测用例规模与约定】
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。

输出二位列表元素
for i in range(n):
print(arr[i], sep='')
输出一维列表元素
print(
arr, sep='')
此处arr为一维数组

def grow_grass(x, y):
    for q in range(4):
        tx = x + next_[q][0]
        ty = y + next_[q][1]
        if tx >= 0 and tx < n and ty >= 0 and ty < m:  # 不能越界
            if arr[tx][ty] == '.':  # 如果本来就有草,则不动,无草,才长
                arr[tx][ty] = 'g'
                flag[tx][ty] = 1


n, m = map(int, input().split())

arr = [list(input()) for _ in range(n)]

flag = [[0 for _ in range(m)] for _ in range(n)]

next_ = [[-1, 0], [1, 0], [0, -1], [0, 1]]  # 用来表示(x, y)的上下左右四个位置

k = int(input())
# print(arr)
# exit()
for i in range(k):
    flag = [[0 for _ in range(m)] for _ in range(n)]
    for j in range(n):
        for p in range(m):
            if arr[j][p] == 'g' and flag[j][p] == 0:
                # print(j, p)
                flag[j][p] = 1
                grow_grass(j, p)

for i in range(n):
    print(*arr[i], sep='')

# print(arr)

# print(flag)

9. 序列计数

【问题描述】
小明想知道,满足以下条件的正整数序列的数量:
1. 第一项为 n;
2. 第二项不超过 n;
3. 从第三项开始,每一项小于前两项的差的绝对值。
请计算,对于给定的 n,有多少种满足条件的序列。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
【样例输入】
4
【样例输出】
7
【样例说明】
以下是满足条件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
【评测用例规模与约定】
对于 20% 的评测用例,1 <= n <= 5;
对于 50% 的评测用例,1 <= n <= 10;
对于 80% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 1000。


有难度
解释在代码注释中

def next_item(res):
    res_ = []
    size = len(res)
    ab = abs(res[size - 1] - res[size - 2])
    if ab <= 1:
        return None
    for i in range(1, ab):
        new_res = []
        new_res += res
        new_res.append(i)
        res_.append(new_res)

    return res_


MOD = 10000

n = int(input())

res_list = []

temp_list = []

accept_list = []

for i in range(1, n + 1):
    res = [n, i]  # 两项时的情况
    res_list.append(res) # 把所有两项情况加入res_list记录

temp_list += res_list  # 把res_list记录进temp_list

while len(temp_list) > 0:
    for i in range(len(temp_list)):  # 判断temp_list的每一项
        next_ = next_item(temp_list[i])  # 判断这项可以再派生下一项
        # print(next_)
        if next_ is not None:  # 如果可以派生下一项,添加记录到accept_list
            accept_list += next_

    temp_list.clear()  # 清空

    if len(accept_list) != 0:
        # print(accept_list)
        # print(res_list)
        res_list = accept_list + res_list  # 把新派生出的项加到res_list,res_list此时已包含两项加新派生的项
        # print(res_list)
        temp_list += accept_list  # 新派生的项加到temp_list进行下次循环用
        accept_list.clear()

# print(res_list)  # 循环结束后,此时所有满足条件的项都在res_list中

print(len(res_list) % MOD)

10. 晚会节目单

【问题描述】
小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。
这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。
小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。
小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
【输入格式】
输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。
第二行包含 n 个整数,依次为每个节目的好看值。
【输出格式】
输出一行包含 m 个整数,为选出的节目的好看值。
【样例输入】
5 3
3 1 2 5 4
【样例输出】
3 5 4
【样例说明】
选择了第1, 4, 5个节目。
【评测用例规模与约定】
对于 30% 的评测用例,1 <= n <= 20;
对于 60% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 100000,0 <= 节目的好看值 <= 100000。

尽可能的好看,表示贪心
每次开始选的时候都要选可选择的值中的表示最好看的值
第一次选只能从前n - m 个中选择
之后则从选出的值对应的索引序号后开始到n - m + count中选
选出的值放入items列表中
当items列表长度小于n - m时开始循环
选满m个值后结束循环
提示:
输出列表直接元素,不带两侧的列表符号
print(*items)
下面这样输出的会带列表符号
print(items)

n, m = map(int, input().split())

count = 1

values = list(map(int, input().split()))

items = [max(values[:n - m + 1])]

max_i = values.index(items[0])

while len(items) < m:
    items.append(max(values[max_i + 1:n-m+count+1]))
    max_i = values.index(items[count])
    count += 1

print(*items)

找了两组测试数据
Example 1:
8 5
1 2 3 5 7 8 10 9
5 7 8 9 10
Example 2:
9 4
1 2 8 5 7 6 3 9 4
8 7 9 4

posted @ 2020-08-26 19:16  笨鸟先飞啊  阅读(834)  评论(1编辑  收藏  举报