欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

洛谷python解题——肖邦“黑键”练习曲

程序员文章站 2022-06-30 22:12:59
肖邦“黑键”练习曲最近参加了公司在OJ平台-洛谷举办的月赛,我呢,就怀着激动的心、颤抖的手,点击报名献个丑;没想到啊,还真是献了个丑,一共6道题,提交了5个,结果没有一个AC的,悲痛声如雷贯耳;但是我也有些小疑问,我写的代码测试了很多次,输出结果完全没问题,时间和内存也都测试过了啊,那问题出在哪里了?所以接下来我先分享一个最简单的题目和我用python的解题思路,看一下问题到底在哪里!题目内容题目背景简单一看,题目描述其实也比较好理解:就是说一个标准的钢琴“黑键”和“白键”加起来一共有88个(很...

肖邦“黑键”练习曲

最近参加了公司在OJ平台-洛谷举办的月赛,我呢,就怀着激动的心、颤抖的手,点击报名献个丑;没想到啊,还真是献了个丑,一共6道题,提交了5个,结果没有一个AC的,悲痛声如雷贯耳;但是我也有些小疑问,我写的代码测试了很多次,输出结果完全没问题,时间和内存也都测试过了啊,那问题出在哪里了?
所以接下来我先分享一个最简单的题目和我用python的解题思路,看一下问题到底在哪里!

题目内容

洛谷python解题——肖邦“黑键”练习曲
题目背景简单一看,题目描述其实也比较好理解:
就是说一个标准的钢琴“黑键”和“白键”加起来一共有88个(很吉利),然而小Z呢,想要编一个程序来实现:按下一定数量的钢琴键,可以统计一共按下了多少次“白键”。
输入输出要求也很简单:第一行输入一个数字,代表我接下来要按下的琴键的个数;第二行输入按下的琴键的编号,中间用空格隔开。
题意很清晰,接下来就开始分析呗,首先我按照要求搜索了一下标准钢琴按键的分布图,如下所示:
洛谷python解题——肖邦“黑键”练习曲
黑白键的分布看得时间久了真的眼晕啊~但也没办法,先把黑白键分别标注一下,看一下有什么规律,于是我就做了一个表格:
洛谷python解题——肖邦“黑键”练习曲
说实话,即使找不到规律,到还有一个笨方法:反正钢琴一共也就88个键,白键也只有52个白键,那我直接把所有的白键序号写进一个列表,然后依次【遍历】就可以了,其实这种方法在数量较少的情况下确实可行,那就干吧,所以先定义一个列表,储存所有白键的序号:

White_Key = [1, 3, 4, 6, 8, 9, 11,13,15,\
                   16,18,20,21,23,25,27,\
                   28,30,32,33,35,37,39,\
                   40,42,44,45,47,49,51,\
                   52,54,56,57,59,61,63,\
                   64,66,68,69,71,73,75,\
                   76,78,80,81,83,85,87,88]

这样看着其实真的不多,真的!
那么接下来我们需要在第一行键入一个数字,代表接下来要输入按键序号的个数:

in_num = int(input())

这里为什么要前面加个int,不必多说,因为通过input()输入的都是字符串类型,需要强制转化为整数类型;接下来我们换行开始键入in_num个钢琴键序号:

list_num = input()
list_split = list_num.split(" ")

看一下这两行代码,第一行就是我们键入的钢琴键序号,比如“2 3 4 5 6”,那第二行的处理是为什么呢?因为同样的,使用input()键入的“2 3 4 5 6”其实是一个字符串,我们想要的是里面的数字,但是这一字符串还包含了一些空格,所以这里使用了.split()方法,用来拆分字符串,.split(" ")的引号内有一个空格,就代表将空格两边的字符进行拆分,然后再将拆分后的字符储存在list_split列表里,我们看一下效果:
输入:

1 2 4 5

结果:

['1', '2', '4', '5']

结果是list_split列表里的内容,我们首先实现里拆分,但其实里面的每一个元素还都是字符串类型,先不急转化,我们可以等到遍历的时候再转换。
接下来设置一个存放白键数量的初始变量“White”并设为0:

White = 0

然后就开始通过for来进行遍历了,我们的思路是先在list_split列表中按顺序把每一个元素与白键列表White_Key里面的序号进行遍历比较,一旦出现相同的值,White变量自身加1,然后跳出for,这样一个按键就判断完了,再开始下一个按下按键的遍历,所以有一个for循环的嵌套:

for i in range(in_num):
    for j in range(52):
        if(int(list_split[i]) == White_Key[j]):
            White += 1
            break

外层循环是我们输入了几个按键,就会执行几次,是为了“解包”出每个按下的按键序号;内层循环是将按下的按键序号与每个白键序号进行对比,并且在这里将list_split里的数字进行类型转换,一旦list_split里的按键序号与White_Key的白键序号相等了,就令White加1,然后跳出循环,进行下一个按下按键的遍历;完整代码如下:

White_Key = [1, 3, 4, 6, 8, 9, 11,13,15,\
                   16,18,20,21,23,25,27,\
                   28,30,32,33,35,37,39,\
                   40,42,44,45,47,49,51,\
                   52,54,56,57,59,61,63,\
                   64,66,68,69,71,73,75,\
                   76,78,80,81,83,85,87,88]
                   
in_num = int(input())
list_num = input()
list_split = list_num.split(" ")

White = 0

for i in range(in_num):
    for j in range(52):
        if(int(list_split[i]) == White_Key[j]):
            White += 1
            break
            
print(White)

我们对题目给出的几个数据进行测试;
输入:

5
1 2 3 4 5

输出:

3

输入:

8
10 20 30 40 50 60 70 80

输出:

4

但是OJ给出的测试点信息是:
洛谷python解题——肖邦“黑键”练习曲
有哪位大神可以指教一下呢?

本文地址:https://blog.csdn.net/qq_37744263/article/details/107183134