【蓝桥杯简单篇】Python组刷题日寄Part05

刷题日记?刷题日寄!
萌新备战蓝桥杯python组
发现有需要纠正的地方,烦请指正!
欢迎小伙伴们的三连+关注!

往期系列:
【蓝桥杯简单篇】Python组刷题日寄Part01

【蓝桥杯简单篇】Python组刷题日寄Part02

【蓝桥杯简单篇】Python组刷题日寄Part03

【蓝桥杯简单篇】Python组刷题日寄Part04

简单篇05

【蓝桥杯简单篇】Python组刷题日寄Part05

  • 第01题:计算器
  • 第02题:色盲的民主
  • 第03题:聪明的美食家
  • 第04题:统计单词数
  • 第05题:笨小猴
  • 第06题:素数求和
  • 第07题:利息计算
  • 第08题:五次方数
  • 第09题:分数统计
  • 第10题:不同单词个数统计

第01题:计算器

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
王小二的计算器上面的LED显示屏坏掉了,于是他找到了在计算器维修与应用系学习的你来为他修计算器。
屏幕上可以显示0~9的数字,其中每个数字由7个小二极管组成,各个数字对应的表示方式如图所示:
在这里插入图片描述
为了排除电路故障,现在你需要计算,将数字A变为数字B需要经过多少次变换?
注意:现在将其中每段小二极管的开和关都定义为一次变换。例如数字1变为2是5次操作。
输入描述:
第一行为一个正整数L,表示数码的长度。
接下来两行是两个长度为L的数字A和B,表示要把数字A变成数字B(数字可以以0开头)。
数据范围:L< =100
输出描述:
一行一个整数,表示这些小二极管一共要变换多少次。
样例输入:
3
101
025
样例输出:
12


答案:

分析:
将7段二极管的开关定义为1或0,这样就用一个字符串表示每个数字的状态,之后逐个对比即可。

l = int(input())
num01 = input()
num02 = input()

lis = ['1110111', '0010010', '1011101', '1011011', '0111010',
       '1101011', '1101111', '1010010', '1111111', '1111011']

count = 0
for i in range(l):
    a = int(num01[i])
    b = int(num02[i])
    if a != b:
        for j in range(7):
            if lis[a][j] != lis[b][j]:
                count += 1

print(count)

第02题:色盲的民主

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
n个色盲聚在一起,讨论一块布的颜色。尽管都是色盲,却盲得各不相同。每个人都有自己的主张,争论不休。最终,他们决定采取民主投票的方式决定布的颜色,不管布同不同意。某种颜色用字符串表示(字符串为颜色单词或词组,也就是可能有被空格隔开的两个单词组成的颜色词组),只要字符串不同,程序即判断颜色不同。现在给出这n个人所选择的颜色,输出最有可能的颜色(也就是获得投票最多的颜色),如果有多个颜色获得了最多的投票,则将它们按字典序分行全部输出。
输入描述:
第一行一个正整数n,表示色盲的人数
接下来n行,每行一句话
数据规模和约定
n<=1000
颜色单词最多20个字符,只包含小写字母或者空格
输出描述:
若干行,获得投票最多的颜色,按字典序输出
样例输入:
5
red
blue
black
black
blue
样例输出:
black
blue


答案:

分析:
利用集合去重,然后利用列表的 count 方法统计元素数量,随后查找对应颜色,按顺序输出。

n = int(input())
lis = []
for i in range(n):
    lis.append(input())

color = list(set(lis))  # 利用集合去重
num = []                # 统计颜色出现数量
for i in color:
    num.append(lis.count(i))
result = []

for i in range(len(num)):       # 统计出现次数最多的颜色
    if num[i] == max(num):
        result.append(color[i])

result.sort()           # 排序
for i in result:
    print(i)

第03题:聪明的美食家

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
如果有人认为吃东西只需要嘴巴,那就错了。
都知道舌头有这么一个特性,“由简入奢易,由奢如简难”(据好事者考究,此规律也适合许多其他情况)。具体而言,如果是甜食,当你吃的食物不如前面刚吃过的东西甜,就很不爽了。
大宝是一个聪明的美食家,当然深谙此道。一次他来到某小吃一条街,准备从街的一头吃到另一头。为了吃得爽,他大费周章,得到了各种食物的“美味度”。他拒绝不爽的经历,不走回头路而且还要爽歪歪(爽的次数尽量多)。
输入描述:
两行数据。
第一行为一个整数n,表示小吃街上小吃的数量
第二行为n个整数,分别表示n种食物的“美味度”

数据规模和约定:
美味度为0到100的整数
n< 1000
输出描述:
一个整数,表示吃得爽的次数
样例输入:
10
3 18 7 14 10 12 23 41 16 24
样例输出:
6


答案:

分析:
本题实际是求最长不下降子序列的长度。利用动态规划思想,具体思路见代码注释。

n = int(input())
lis = list(map(int, input().split()))
lis.insert(0, 0)            # 初始相当于先吃一个为美味度0的
dp = [0 for i in range(n+1)]
# dp[i] 表示前i+1个元素的序列中 最长不下降子序列的长度
# dp[0] = 0, 因此初始都赋值为0
for i in range(1, n+1):
    temp = []
    for j in range(i):
        if lis[j] <= lis[i]:
            # 如果第 j+1 个小于第 i+1 个
            temp.append(dp[j]+1)
            # 那么爽的次数+1
    dp[i] = max(temp)
print(max(dp))

第04题:统计单词数

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
统计输入英文文章段落中不同单词(单词有大小写之分,  但统计时忽略大小写)各自出现的次数。 输入段落中所含单词的总数不超过100,最长单词的长度不超过20个字母.
输入描述:
一个包含若干句子的段落, 每个句子由若干英文单词组成. 除空格,  逗号和句号外, 这些输入的句子中不含其他非字母字符, 并且, 逗号和句号紧跟在它前面的英文单词后面, 中间没有空格. 段落最后一个字符是回车符,  表示输入结束.
输出描述:
若段落中共有M个不同的英文单词,则按照其在段落中出现的先后顺序输出M行,各行的格式为:  单词中所有字母均用大写形式输出(最长的单词顶格输出,它前面没有多余的空格;  其余单词与其右对齐)+冒号+N个*号+该单词在段落中的出现次数N
样例输入:
This is a test. This test is easy. This is a test. This test is easy.
样例输出:

THIS:****4
  IS:****4
   A:**2
TEST:****4
EASY:**2

答案:

分析:
字符串的 strip(), split(), upper() 方法;列表的 count() 方法;格式化输出。

s = input().strip().split()
word = []
L = 0
for i in range(len(s)):
    s[i] = s[i].strip('.')
    s[i] = s[i].strip(',')
    s[i] = s[i].upper()
    if s[i] not in word:
        word.append(s[i])
L = max([len(i) for i in word])
for i in word:
    num = s.count(i)
    print('{1:>{0:}}:'.format(L, i)+'*'*num+str(num))

第05题:笨小猴

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
输入描述:
输入文件只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。
输出描述:
输出文件共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。
样例输入:
error
样例输出:
Lucky Word
2


答案:

分析:
略。

s = list(input())
num = []
for i in set(s):
    num.append(s.count(i))
result = max(num) - min(num)

def prime(n):
    if n <= 1:
        return False
    else:
        for i in range(2, n):
            if n%i == 0:
                return False
        return True

if prime(result):
    print('Lucky Word')
    print(result)
else:
    print('No Answer')
    print('0')

第06题:素数求和

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
输入一个自然数n,求小于等于n的素数之和
输入描述:
数据规模和约定
测试样例保证 2 < = n < = 2,000,000
输出描述:

样例输入:
2
样例输出:
2


答案:

分析:
如果遍历每个小于等于n个数,判断其是否为质数,运算时间过长,会超时。
这里采用埃拉托色尼筛选法,即每找到一个质数,都将其的倍数从遍历列表中删去,这样便减少了计算量。代码中可以用 bool 运算符表示其是否在遍历列表中。具体见代码注释。

n = int(input())

def prime(n):
    # 判断是否为质数
    for i in range(2, n//2+1):
        if n%i == 0:
            return False
    return True

primes = [True for i in range(n+1)]
# 表示是否为遍历列表中,即是否为质数
# 因为实际计算中用不到0和1,这里也就不用再将其置为False
result = 0
for i in range(2, n+1):
    # 从第一个质数2开始
    if primes[i]:
        # 如果是质数, 即 primes[i]==True
        for j in range(i*2, n+1, i):
            # 将这个质数的倍数都置为False
            primes[j] = False
        result += i
print(result)      

第07题:利息计算

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
编制程序完成下述任务:接受两个数,一个为用 户一年期定期存款金额,一个为按照百分比格式表示的利率;程序计算一年期满后本金与利息总额。说明:
(1)存款金额以人民币元为单位,可能精确到分;
(2)输入利率时不需要输入百分号,例如一年期定期存款年利率为2.52%,用户输入2.52即可;
(3)按照国家法律,存款利息所得需缴纳20% 的所得税,计算结果时所得税部分应扣除。
输入描述:
输入一行,包含两个实数,分别表示本金和年利率。
输出描述:
输出一行,包含一个实数,保留到小数点后两位,表示一年后的本金与利息和。
样例输入:
10000 2.52
样例输出:
10201.60


答案:

分析:
略。

money, rate = map(float, input().split())
print('{:.2f}'.format(money*(1+rate*0.01*0.8)))

第08题:五次方数

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
对一个数(大于1)十进制表示时的每一位数字乘五次方再求和,会得到一个数的五次方数
例如:1024的五次方数为1+0+32+1024=1057
有这样一些神奇的数,它的五次方数就是它自己,而且这样的数竟然只有有限多个
从小到大输出所有这样的数
输入描述:

输出描述:
每个数独立一行输出
样例输入:

样例输出:


答案:

分析:
要提前判断大致边界。

for i in range(2, 299999):
    temp = 0
    for j in str(i):
        temp += int(j)**5
    if temp == i:
        print(i)

第09题:分数统计

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
给定一个百分制成绩T,将其划分为如下五个等级之一:
90~100A80~89B70~79C60~69D0~59E
现有若干百分制成绩(成绩个数不超过1000个),请你统计五个等级段的人数,并找出人数最多的那个等级段,按照从大到小的顺序输出该段中所有人成绩(保证人数最多的等级只有一个)。
输入描述:
第一行是成绩的个数 n
第二行是学生的成绩,若干0~100 的正整数,用空格隔开
输出描述:
第一行为5个正整数,分别表示 A,B,C,D,E 五个等级段的人数
第二行一个正整数,表示人数最多的等级段中人数
接下来一行若干个用空格隔开的正整数,表示人数最多的那个等级中所有人的分数,按从大到小的顺序输出。
样例输入:
10
100 80 85 77 55 61 82 90 71 60
样例输出:
2 3 2 2 1
3
85 82 80


答案:

分析:
略。

n = int(input())
lis = list(map(int, input().split()))
sta = [[], [], [], [], []]
for i in lis:
    if 90 <= i <= 100:
        sta[0].append(i)
    elif 80 <= i <= 89:
        sta[1].append(i)
    elif 70 <= i <= 79:
        sta[2].append(i)
    elif 60 <= i <= 69:
        sta[3].append(i)
    else:
        sta[4].append(i)

L = 0
for i in sta:
    print(len(i), end=' ')
    if len(i) > L:
        L = len(i)
        result = i

print()
print(L)
result.sort(reverse=True)
for i in result:
    print(i, end=' ')

第10题:不同单词个数统计

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数。例如:对于句子“one little two little three little boys”,总共有5个不同的单词:one, little, two, three, boys。
说明:
(1)输入的句子当中只包含英文字符和空格,单词之间用一个空格隔开;
(2)不用考虑单词的大小写,假设输入的都是小写字符;
(3)句子长度不超过100个字符。
输入描述:
输入只有一行,即一个英文句子。
输出描述:
输出只有一行,是一个整数,表示句子中不同单词的个数。
样例输入:
one little two little three little boys
样例输出:
5


答案:

分析:
略。

word = set(input().split())
print(len(word))

你可能感兴趣的:(#,蓝桥杯Python组刷题日寄,Python学习笔记,数据结构&算法,蓝桥杯,python,职场和发展)