题目名称 | 633. [GZOI2011] 乐谱变调 |
---|---|
输入输出 | music.in/out |
难度等级 | ★ |
时间限制 | 1000 ms (1 s) |
内存限制 | 128 MiB |
测试数据 | 5 |
题目来源 | cqw 于2011-11-29加入 |
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:10, 提交:21, 通过率:47.62% | ||||
LGLJ | 100 | 0.000 s | 0.00 MiB | C++ |
王者自由 | 100 | 0.001 s | 0.26 MiB | C++ |
苏轼 | 100 | 0.001 s | 0.27 MiB | C++ |
Makazeu | 100 | 0.001 s | 0.27 MiB | C++ |
Bokjan | 100 | 0.001 s | 0.29 MiB | C++ |
落尘 | 100 | 0.001 s | 0.32 MiB | C++ |
瑆の時間~無盡輪迴·林蔭 | 100 | 0.002 s | 13.66 MiB | C++ |
瑆の時間~無盡輪迴·林蔭 | 100 | 0.002 s | 13.66 MiB | C++ |
旋转华尔兹 | 100 | 0.004 s | 0.32 MiB | C++ |
Lethur | 100 | 0.005 s | 0.23 MiB | C++ |
关于 乐谱变调 的近10条评论(全部评论) | ||||
---|---|---|---|---|
被坑……QAQ……
落尘
2015-10-21 20:00
2楼
| ||||
|
【问题描述】
大家应该听过很多美妙动听的歌曲,也曾经在卡拉OK中唱过不少歌曲。其实,很多歌曲的调子都经过了变调,因为很多歌曲原来的调子一般都偏高,需要把调适当降低,才适合一般人歌唱。现在请你编程解决这个变调的问题,把一个曲谱从原来的调子基础上,升高或降低若干个调,变成一个新的曲谱。
【音阶】
相信大家都见过电子琴,也听过电子琴,琴中的每个白色键,代表的是简谱中的1,2,3,4,5,6,7的音阶,用字母代表即为 C,D,E,F,G,A,B,见下图:
此外,上面的黑键表示半音,按照上图,从左边到右边的5个黑键代表的半音为:#C,#D,#F,#G,#A
由最左边的音阶C数起到第七个音阶B,中间的黑键和键,均处于一个基准八度区域,在B右边的琴键,比原来的音阶高一个八度区域,称为高八度区域; C音阶左边的琴键(图片没有显示),比原来的音阶低一个八度区域,称为低八度区域。
【乐谱】
一个歌曲的乐谱,包括音阶、节奏、小节线、休止符等元素,这里为了简单表示,只保留音阶这一元素,节奏、小节线、休止符不在此题目中展现。
乐谱中的每个音阶,可以用C,D,E,F,G,A,B,#C,#D,#F,#G,#A 表示。
在乐谱中会牵涉到八度区域的迁移问题,我们使用 “>”、“<” 来变化当前的八度区域。其中“>”表示提高当前八度区域(例如从低八度区域=>基准八度区域),“<”表示降低当前八度区域(例如高八度区域=>基准八度区域)。乐谱一开始的时候,当前八度区域为基准八度区域。
【乐谱变调】
对一个乐谱,提高或者降低N个半音的操作,成为乐谱变调。
首先,对于一个八度区域中,以下音阶均相隔一个半音。
C,#C,D,#D,E,F,#F,G,#G,A,#A,B
然后,B音阶比高它一个八度区域的C音阶,相隔一个半音
变调就是一个简单的升降音阶的操作,只要数着半音阶个数修改音阶即可。例如,C音阶提高6个半音,数过去就是#F,B音阶提高4个音阶,则为下一个八度区域的 #D 音阶,同理,#F降6个半音阶(升-6个半音)则为C。
【输入格式】
输入第一行字符串,包含上面的各个音阶,以及>/<符号,表示一个乐谱,乐谱字符串长度<=200,没有空格和其他字符串。
输入第二行为整数N (-16<=N<=16) ,表示升多少个半音
【输出格式】
输出为一行字符串,代表乐谱。
【输入样例】
CDEFGAB>C
2
【输出样例】
DE#FGAB>#CD