题目名称 633. [GZOI2011] 乐谱变调
输入输出 music.in/out
难度等级
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 5
题目来源 Gravatarcqw 于2011-11-29加入
开放分组 全部用户
提交状态
分类标签
基本 字符串 模拟
分享题解
通过:10, 提交:21, 通过率:47.62%
GravatarLGLJ 100 0.000 s 0.00 MiB C++
Gravatar王者自由 100 0.001 s 0.26 MiB C++
Gravatar苏轼 100 0.001 s 0.27 MiB C++
GravatarMakazeu 100 0.001 s 0.27 MiB C++
GravatarBokjan 100 0.001 s 0.29 MiB C++
Gravatar落尘 100 0.001 s 0.32 MiB C++
Gravatar瑆の時間~無盡輪迴·林蔭 100 0.002 s 13.66 MiB C++
Gravatar瑆の時間~無盡輪迴·林蔭 100 0.002 s 13.66 MiB C++
Gravatar旋转华尔兹 100 0.004 s 0.32 MiB C++
GravatarLethur 100 0.005 s 0.23 MiB C++
关于 乐谱变调 的近10条评论(全部评论)
被坑……QAQ……
Gravatar落尘
2015-10-21 20:00 2楼
GravatarBokjan
2014-11-04 20:25 1楼

633. [GZOI2011] 乐谱变调

★   输入文件:music.in   输出文件:music.out   简单对比
时间限制:1 s   内存限制:128 MiB

【问题描述】
大家应该听过很多美妙动听的歌曲,也曾经在卡拉OK中唱过不少歌曲。其实,很多歌曲的调子都经过了变调,因为很多歌曲原来的调子一般都偏高,需要把调适当降低,才适合一般人歌唱。现在请你编程解决这个变调的问题,把一个曲谱从原来的调子基础上,升高或降低若干个调,变成一个新的曲谱。

【音阶】
相信大家都见过电子琴,也听过电子琴,琴中的每个白色键,代表的是简谱中的1,2,3,4,5,6,7的音阶,用字母代表即为 C,D,E,F,G,A,B,见下图:
music-1

此外,上面的黑键表示半音,按照上图,从左边到右边的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