当前位置:   article > 正文

蓝桥杯3月刷题集训-A 【枚举&模拟】Day1~Day2_xvvaq

xvvaq

蓝桥杯3月刷题集训-A 【枚举&模拟】Day1~Day2

一、成绩分析

题目描述

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

请计算这次考试的最高分、最低分和平均分。

输入描述:

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

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

输出描述

输出三行。

第一行包含一个整数,表示最高分。

第二行包含一个整数,表示最低分。

第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。

输入输出样例

*示例:

输入

7
80
92
56
74
88
99
10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出

99
10
71.29
  • 1
  • 2
  • 3

*运行限制:

  • 最大运行时间:1s
  • 最大运行内存: 256M

这道题目主要考察四舍五入保留正好两位小数的方法。在python中主要有四种方法实现。

  1. %.2f
  2. format方法
  3. round函数
  4. f-string

其中f-string方法需要Python 3.6及以上版本,本人在蓝桥杯官网测试过这四种方法,其中round函数只能通过8个样例,其余可以全部通过。

score = []
n = int(input())
for i in range(n):
  i = int(input())
  score.append(i)
print(max(score))
print(min(score))
avg_ = sum(score)/n
# print('%.2f'%(avg_))
# print(round(avg_,2))
# print('{:.2f}'.format(avg_))
print(f'{avg_:.2f}')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

二、饮料换购

题目描述

乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料,凭 3 个瓶盖可以再换一瓶 C 型饮料,并且可以一直循环下去(但不允许暂借或赊账)。

请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。

输入描述

输入一个整数 n ( 0 < n < 1000 ) n(0<n<1000) n(0<n<1000),表示开始购买的饮料数量。

输出描述

输出一个整数,表示实际得到的饮料数

输入输出样例

示例

输入

100
  • 1

输出

149
  • 1

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

这道题目主要考察循环和整数除法的概念,循环用于重复执行一组操作,直到满足某个条件为止。整数除法是指在两个整数相除时,只保留其整数部分并舍去小数部分的操作。

n = int(input())
result = n
while n >= 3:
    result += n // 3    # n除以3并向下取整
    n = n // 3 + n % 3  # n除以3的商加上n除以3的余数
print(result)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

三、刷题统计

问题描述

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题?

输入格式

输入一行包含三个整数 a*,*b 和 n.

输出格式

输出一个整数代表天数。

样例输入

10 20 99
  • 1

样例输出

8
  • 1

评测用例规模与约定

对于 50% 的评测用例, 1 ≤ a , b , n ≤ 1 0 6 1≤a,b,n≤10^6 1a,b,n106.

对于100% 的评测用例, 1 ≤ a , b , n ≤ 1 0 18 1≤a,b,n≤10^{18} 1a,b,n1018.

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

虽然本题的标签是简单题,但是如果不注意一些细节的话,可能无法全部通过,我在前几次编写程序的时候,只通过了5和7个样例,欠缺了一些考虑,大致的做题思路就是,我们可以先计算一整周的总做题数,然后用n算出做了几个整周的天数,然后算出剩余没有做的题数,也就是出去多个整周的题目,剩余不到一整周的题目数,因为工作日和周末做题数不一致,所以我们需要判断剩余题数是在工作日做完还是在周末做完,剩下的判断就比较简单了。

a, b ,n = map(int, input().split())
sum_7 = 5 * a + 2 * b   # 一整周的做题数
days = (n // sum_7 ) * 7    # 做了几个整周的天数
n %= sum_7  # 剩余题数
if n <= 5 * a:  # 剩余题数工作日能做完
  days += n // a    # 做完剩余题数的天数
  if n % a == 0:    # 如果剩余题数刚好做完
    days += 0   # 天数不变
  else:     # 如果剩余题数没做完
      days += 1     # 天数加1
else:       # 剩余题数工作日做不完
  days += 5     # 加上之前的五天
  n -= 5 * a    # 减去五天的做题数
  days += n // b    # 做完剩余题数的天数
  if n % b == 0:    # 如果剩余题数刚好做完
    days += 0       # 天数不变
  else:     # 如果剩余题数没做完
      days += 1     # 天数加1
print(days)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

四、天干地支

题目描述

古代中国使用天干地支来记录当前的年份。

天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。

地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、 亥(hài)。

将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。

2020 年是庚子年。

每过一年,天干和地支都会移动到下一个。例如 2021 年是辛丑年。

每过 60 年,天干会循环 6 轮,地支会循环 5 轮,所以天干地支纪年每 60 年轮回一次。例如 1900 年,1960 年,2020 年都是庚子年。

给定一个公元纪年的年份,请输出这一年的天干地支年份。

输入描述

输入一行包含一个正整数,表示公元年份。

其中有 ,输入的公元年份为不超过 9999 的正整数。

输出描述

输入一行包含一个正整数,表示公元年份。

输入输出样例

示例

输入

2020
  • 1

输出

gengzi
  • 1

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

本题难点就在于如何模拟这个循环过程,我们需要抓住关键的两点,天干地支对应的长度,天干有十个,地支有十二个,还有一点就是每60年一循环,题目中已知1900 年,1960 年,2020 年都是庚子年,我们可以推算出最近的甲子年,是1984年,那么我们就可以用输入的年份减去这个年份然后对60取模,然后再分别对天干地支的长度取模,最后得出在天干地支中对应的下标。

year = int(input()) 
T = ['jia', 'yi', 'bing', 'ding', 'wu', 'ji', 'geng', 'xin', 'ren', 'gui']
D = ['zi', 'chou', 'yin', 'mao', 'chen', 'si', 'wu', 'wei', 'shen', 'you', 'xu', 'hai']
print(T[(year - 1984) % 60 % 10] + D[(year - 1984) % 60 % 12])
  • 1
  • 2
  • 3
  • 4

五、递增序列

题目描述

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

对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 45 度的斜线上,这两个字母从左向右看、或者从上向下看是递增的。

例如,如下矩阵中

LANN
QIAO
  • 1
  • 2

LNLNANANIOAOLQAINONOAQINAN 等 13 个 递增序列。注意当两个字母是从左下到右上排列时,从左向右看和从上向下看 是不同的顺序。

对于下面的30 行 50 列的矩阵,请问总共有多少个递增序列?

VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG
SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF
ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA
BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL
YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH
ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU
XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR
ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG
MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA
VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF
GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC
EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK
PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW
CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP
RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS
PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR
JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL
YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP
HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN
DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF
LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW
CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ
IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI
ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB
HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP
FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS
VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ
BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR
RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY
ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

我们将给定的字符串 matrix 首先转换为一个二维列表 chars,其中每个元素都是一个字母,然后使用三重嵌套的循环,分别遍历矩阵中的每个元素,并统计符合条件的元素对数目。其中:

  • 外层循环遍历每一行;
  • 内层循环遍历当前行中的每一个元素;
  • 第二层内层循环从当前元素的右侧开始,遍历当前行中所有比它大的元素;
  • 第三层内层循环从当前元素的下方开始,遍历当前列中所有比它大的元素;
  • 每遍历到一个比当前元素大的元素,就将符合条件的元素对数目加一;
  • 最后将统计得到的元素对数目返回。

需要注意的是,我们统计的是矩阵中比其右侧,下方以及右下方元素大的元素对数目,并且并没有去除重复的元素对。也就是说,如果矩阵中存在多个相同的元素,并且这些序列都符合条件,那么这些序列也算。

matrix = '''VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG
SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF
ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA
BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL
YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH
ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU
XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR
ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG
MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA
VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF
GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC
EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK
PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW
CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP
RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS
PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR
JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL
YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP
HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN
DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF
LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW
CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ
IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI
ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB
HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP
FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS
VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ
BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR
RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY
ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX'''

# 将字符串matrix 转换为一个二维列表 chars,每个元素都是一个字母
chars = [list(i) for i in matrix.split('\n')]
# 定义一个变量 count,用于统计符合条件的元素对数,初始值为 0
count = 0

for i in range(len(chars)):
    for j in range(len(chars[0])):
        # 统计行
        # 从当前元素的右边开始,遍历当前行中所有比它大的元素
        for k in range(j+1, len(chars[0])):
            if chars[i][j] < chars[i][k]: 
                count += 1
        # 统计列
        # 从当前元素的下面开始,遍历当前列中所有比它大的元素
        for n in range(i+1, len(chars)):
            if chars[i][j] < chars[n][j]: 
                count += 1
        # 统计右对角线
        # 从当前元素的右下角开始,遍历当前右对角线中所有比它大的元素
        row = i+1
        col = j+1
        while row < len(chars) and col < len(chars[0]):
            if chars[i][j] < chars[row][col]: 
                count += 1
            row += 1;col += 1
        # 统计左对角线
        # 从当前元素的左下角开始,遍历当前左对角线中所有比它大的元素
        row = i+1
        col = j-1
        while row < len(chars) and col >= 0:
            if chars[i][j] != chars[row][col]: 
                count += 1
            row += 1
            col -= 1
print(count)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/article/detail/48475
推荐阅读
相关标签
  

闽ICP备14008679号