蓝桥杯刷题(2)

1.单词分析

题目描述

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。

输入描述

输入一行包含一个单词,单词只由小写英文字母组成。

对于所有的评测用例,输入的单词长度不超过 1000。

输出描述

输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。

这里我们利用count来计算字母出现次数,同时注意,当出现最多的字母有多个时进行比较

import os
import sys

# 请在此输入您的代码
s = input()
n = 0
w = ""
s1 = set(s)
for i in s:
    a = s.count(i)
    if a>n:
      n = a
      w = i
    elif a==n:
      if w>i:
        w = i
print(w)
print(n)

2.

题目描述

小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。

请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。

输入描述

输入的第一行包含一个整数 n\ (1 \leq n \leq 10^4)n (1≤n≤104),表示考试人数。

接下来 nn 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出描述

输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。

这里要利用{:.0f}来保留0位小数

import os
import sys

# 请在此输入您的代码
num = int(input())
p = 0
good = 0
for i in range(num):
    a = int(input())
    if a>=60:
        p += 1
    if a>=85:
        good += 1
print("{:.0f}%".format(p*100/num))
print("{:.0f}%".format(good*100/num))

3.

如下图所示,GG 是一个无向图,其中蓝色边的长度是 11、橘色边的长度是 22、绿色边的长度是 33。

则从 AA 到 SS 的最短距离是多少?

这里使用穷举法,列出所有可能的路径长度,再选出最短路径,因为题目没有要求路径,所以我们只储存数值

import os
import sys

# 请在此输入您的代码
path = [
    ["A", "E", 1],
    ["A", "B", 2],
    ["A", "C", 1],
    ["A", "D", 1],
    ["A", "E", 1],
    ["B", "G", 1],
    ["B", "J", 2],
    ["C", "D", 3],
    ["C", "G", 3],
    ["C", "F", 3],
    ["D", "G", 2],
    ["D", "H", 1],
    ["D", "I", 2],
    ["E", "H", 1],
    ["E", "I", 3],
    ["F", "J", 1],
    ["F", "G", 1],
    ["G", "K", 2],
    ["G", "I", 3],
    ["H", "L", 2],
    ["H", "I", 1],
    ["I", "M", 3],
    ["J", "S", 2],
    ["K", "N", 1],
    ["K", "L", 3],
    ["L", "R", 1],
    ["L", "M", 1],
    ["M", "N", 2],
    ["M", "Q", 1],
    ["M", "S", 1],
    ["N", "P", 1],
    ["Q", "O", 1],
    ["O", "R", 3],
    ["P", "O", 1],
    ["R", "S", 1],
]  # 所有路径点
num = []  # 记录A到S的路径

def get(nums,letter):
    for x, y in enumerate(path):
        if y[0] == letter[1]:
            nums += y[2]
            if y[1] == "S":
                num.append(nums)
            else:
                get(nums = nums, letter = y)

for a,b in enumerate(path):
    n = 0
    if b[0] == "A":
        get(nums = b[2], letter = b)
print(min(num))

4.

题目描述

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。

有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。

也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。

给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

输入描述

输入包含一个八位整数 NN,表示日期。

对于所有评测用例,10000101 \leq N \leq 8999123110000101≤N≤89991231,保证 NN 是一个合法日期的 8 位数表示。

输出描述

输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。

这里我的做法应设循环判断日期是否合法,答题时没考虑到(直接过了),权当错误示范

import os
import sys
# 请在此输入您的代码
# 因为有八个日期可以得出一年只有一个回文日期
word_0 = input()
word_1 = word_0[0:4]
word_2 = str(int(word_1)+1) + str(int(word_1)+1)[::-1]
print(word_2)
word_3 = word_0[0:2]
word_4 = word_3 + word_3 + word_3[::-1] + word_3[::-1]
if word_4 == word_0:
  word_4 = str(int(word_3)+1) + str(int(word_3)+1) + str(int(word_3)+1)[::-1] + str(int(word_3)+1)[::-1]
  print(word_4)
else:
  print(word_4)

5.

小蓝要为一条街的住户制作门牌号。

这条街一共有 20202020 位住户,门牌号从 11 到 20202020 编号。

小蓝制作门牌的方法是先制作 00 到 99 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、71、0、1、7,即需要 11 个字符 00,22 个字符 11,11 个字符 77。

请问要制作所有的 11 到 20202020 号门牌,总共需要多少个字符 22?

import os
import sys

# 请在此输入您的代码
num = 0
for i in range (1,2021):
  n=str(i).count('2')  # 2出现的次数
  num += n
print(num)

6.小蓝有很多数字卡片,每张卡片上都是数字 00 到 99。 小蓝准备用这些卡片来拼一些数,他想从 11 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 11 拼到多少。 例如,当小蓝有 3030 张卡片,其中 00 到 99 各 33 张,则小蓝可以拼出 11 到 1010, 但是拼 1111 时卡片 11 已经只有一张了,不够拼出 1111。 现在小蓝手里有 00 到 99 的卡片各 20212021 张,共 2021020210 张,请问小蓝可以从 11 拼到多少? 提示:建议使用计算机编程解决问题

import os
import sys

# 请在此输入您的代码
num = 0
m = 1

while True:
  n = m
  a = str(n).count('1')
  num += a
  if num == 2021:
    break
  m += 1

print(m)

7.

小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。

这不,大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。

小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。

现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。

取款机只能提供 100100 元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。

以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。

****     180.90       88折
****      10.25       65折
****      56.14        9折
****     104.65        9折
****     100.30       88折
****     297.15        半价
****      26.75       65折
****     130.62        半价
****     240.28       58折
****     270.62        8折
****     115.87       88折
****     247.34       95折
****      73.21        9折
****     101.00        半价
****      79.54        半价
****     278.44        7折
****     199.26        半价
****      12.97        9折
****     166.30       78折
****     125.50       58折
****      84.98        9折
****     113.35       68折
****     166.57        半价
****      42.56        9折
****      81.90       95折
****     131.78        8折
****     255.89       78折
****     109.17        9折
****     146.69       68折
****     139.33       65折
****     141.16       78折
****     154.74        8折
****      59.42        8折
****      85.44       68折
****     293.70       88折
****     261.79       65折
****      11.30       88折
****     268.27       58折
****     128.29       88折
****     251.03        8折
****     208.39       75折
****     128.88       75折
****      62.06        9折
****     225.87       75折
****      12.89       75折
****      34.28       75折
****      62.16       58折
****     129.12        半价
****     218.37        半价
****     289.69        8折

需要说明的是,8888 折指的是按标价的 88%88 计算,而 88 折是按 80%80 计算,余者类推。 特别地,半价是按 50%50 计算。

请输出小明要从取款机上提取的金额,单位是元。

import os
import sys

# 请在此输入您的代码
data = """
****     180.90       88折
****      10.25       65折
****      56.14        9折
****     104.65        9折
****     100.30       88折
****     297.15        半价
****      26.75       65折
****     130.62        半价
****     240.28       58折
****     270.62        8折
****     115.87       88折
****     247.34       95折
****      73.21        9折
****     101.00        半价
****      79.54        半价
****     278.44        7折
****     199.26        半价
****      12.97        9折
****     166.30       78折
****     125.50       58折
****      84.98        9折
****     113.35       68折
****     166.57        半价
****      42.56        9折
****      81.90       95折
****     131.78        8折
****     255.89       78折
****     109.17        9折
****     146.69       68折
****     139.33       65折
****     141.16       78折
****     154.74        8折
****      59.42        8折
****      85.44       68折
****     293.70       88折
****     261.79       65折
****      11.30       88折
****     268.27       58折
****     128.29       88折
****     251.03        8折
****     208.39       75折
****     128.88       75折
****      62.06        9折
****     225.87       75折
****      12.89       75折
****      34.28       75折
****      62.16       58折
****     129.12        半价
****     218.37        半价
****     289.69        8折
"""
data = data.split()
lenght = len(data)
count = 0
for i in range(1, lenght, 3):
    if data[i+1] == '半价':
        discount = 50
    else:
        discount = int(data[i+1].strip('折'))
        if discount < 10:
            discount = discount * 10
    count = count + float(data[i])*discount/100
num = int(count/100)
print(100*(num+1))

8.

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

输入描述

输入的第一行包含一个整数 N\ (1 \leq N \leq 100)N (1≤N≤100),表示三角形的行数。

下面的 NN 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。

输出描述

输出一个整数,表示答案。

根据题目要求,若为奇数行则为中间那个数,若为偶数则选两者较大,其中左偏向右,右偏向左

import os
import sys

# 请在此输入您的代码
row = int(input())
delta = [list(map(int, input().split())) for i in range(row)]

for i in range(1, row):
    for j in range(0, i + 1):
        if j == 0:
            delta[i][j] += delta[i - 1][j]
        elif j == i:
            delta[i][j] += delta[i - 1][j - 1]
        else:
            delta[i][j] += max(delta[i - 1][j - 1: j + 1])

if row & 1:
    print(delta[-1][row // 2])
else:
    print(max(delta[-1][row // 2 - 1], delta[-1][row // 2]))

 9.

题目描述

本题输入内容为参加某次大赛学校及其参赛学生的得分等信息

其基本格式如下:

aaa 工程技术学院:010-21345673:na005:xijing

84:java:13553001115:张小林

67:c:13725330616:李自云

25:java:13312349988:肖为

bbb 理工大学:094-32421233:km008:lushan

81:c:18997111533:徐路

92:java::曹丽

ccc 传媒大学:041-44441233:mt009:linhai

88:c++:15900010002:夏侯艺人

第一行数据是院校信息,信息项以冒号(:)分开。

院校信息共有 4 项,从左到右依次是:

  1. 院校名称,不多于 15 个字符,可能含有汉字。

  2. 院校电话,不多于 15 个字符,只含有数字或空格或连字符(-)。

  3. 院校编号,不多于 6 个字符,只含有数字和字母。

  4. 归属地,不多于 8 个字符。只含有字母。

接下来是若干行(至少 1 行,不多于 100 行)学生信息,直到遇到下一条院校信息。

院校信息与学生信息的区别是:第一项如果是一个 0 ~ 100 间的整数,则为学生信息,否则为院校信息。

学生信息一共 4 项,从左到右依次是:

成绩,1 ~ 100 的整数。

参赛组别,不多于 10 个字符,只含英文和数字。

学生电话,不多于 15 个字符,只含有数字或空格或连字符(-),该信息可能为空。

学生姓名,不多于 6 个字符,可以包含汉字。

院校的信息不超过 1000 行,且每个参赛院校只有一条信息。

所有信息项,除了学生电话一项外,均不为空。

要求编程,读入输入内容,按照新的格式组织输出。

具体要求:

  1. 编码方式为 GB2312

  2. 输出信息为每个学生占一行,包含其所属院校的信息。

  3. 输出信息的顺序,按照信息在 in.txt 出现的先后顺序

  4. 每个信息项占用固定的宽度(注意每个汉字的输出宽度为 2),其宽度规格明细为:

院校名称:30

院校电话:16

院校编号:6

归属地: 8

学生成绩:4

参赛组别:10

学生电话:16

学生姓名:12

  1. 每项信息在其宽度区间内左对齐,不足宽度用西文空格填充(注意不是用 tab 制表符)。

  2. 归属地是如下字符串的,输出用等号后的汉字串代替:

xijing=西京

lushan=鲁山

pingyang=平阳

danling=丹凌

xinyuan=新元

如果输入内容如上所示,输出则应为如下所示,即输出文件内容为:

na005 aaa 工程技术学院 010-21345673 西京 张小林 java 84 13553001115

na005 aaa 工程技术学院 010-21345673 西京 李自云 c 67 13725330616

na005 aaa 工程技术学院 010-21345673 西京 肖为 java 25 13312349988

km008 bbb 理工大学 094-32421233 鲁山 徐路 c 81 18997111533

km008 bbb 理工大学 094-32421233 鲁山 曹丽 java 92

mt009 ccc 传媒大学 041-44441233 linhai 夏侯艺人 c++ 88 15900010002

这里我写的代码显示答案错误,暂不展示,等待查阅相关资料

10.

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。

在冒泡排序中,每次只能交换相邻的两个元素。

小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。

例如,对于字符串 lanlan 排序,只需要 11 次交换。对于字符串 qiaoqiao 排序,总共需要 44 次交换。

小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。

请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。

这里我们要知道冒泡排序的最大交换次数为:n*(n-1)/2,且后位元素向前移多少位就减少多少次交换,由于字典序最小,故选择正位

import os
import sys

# 请在此输入您的代码
word = "abcdefghijklmnopqrstuvwxyz"
n = 1
while True:
    if n*(n-1)/2 > 100:
        break
    n += 1
a = int(n*(n-1)/2-100)
word_1 = word[0:n]
word_2 = word_1[::-1]
print(word_2[a]+word_2[0:a]+word_2[a+1:n])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值