原题链接:题目25 - ACM在线评测系统
时间限制:1000 ms | 内存限制:65535 KB
难度:1
描述
巴赫先生是一位著名的音乐作曲家。他最著名的作品之一是他那套前奏曲。这24片跨越24个音乐键(有音乐的12个不同刻度说明,每个能取大调或小调)。这12个有区别的“刻度说明”如下:
A | A#=Bb | B | C | C#=Db | D | D#=Eb | E | F | F#=Gb | G | G#=Ab |
五个说明正如上面用等号表示的,有两个可替换的名字。因此,这些刻度说明有17个(12+5)可能的名字,但是仅有12个说明在音乐上有区别。在使用其中之一作为音乐键的基调时,我们能更进一步区分音调的大调(major)和小调(minor)。这便给出了34个(17*2)可能键,其中有24个(12*2)在音乐上有区别。 在为他的前奏曲命名时,巴赫先生使用了除下面所示的10个之外所有键,这10个键的命名被可替换的名字替代:
Ab minor | A# major | A# minor | C# major | Db minor |
D# major | D# minor | Gb major | Gb minor | G# major |
写一个程序,给出键的名字,如果有就给它一个可替换的名字,或者报告这个键名是唯一(UNIQUE)的。
输入
每个测试用例被描述为一行:格式为“说明 音调”,这里“说明”是“刻度说明”,可以取17个名字中的一个,而“音调”是“major”或“minor”。
输出
对每个用例输出需要的答案,格式参照样例输出。
样例输入
Ab minor
D# major
G minor
样例输出
Case 1: G# minor
Case 2: Eb major
Case 3: UNIQUE
解题思路:
逐个字符判断相应串特征:如果前一个串只有单个字符,没有可替换的名字,就是UNIQUE;如果前一个字符可以分解成两部分,根据表一的规律,G#=Ab是特例可单独讨论,其它按照等式,首字符加一或减一,后面不是跟#、就是跟b;学习优秀代码,“循环”取模也可以。
注意事项:
还以为不能输出表二中列出的十个东西,原来,唉,直接忽略那一段就OK了。要不然,这题的难度真是1吗?
参考代码:
#include <stdio.h> #include <string.h> char str[100]; int cas = 1; int main(){ while(gets(str)){ int i,j,len; printf("Case %d: ",cas++); len = strlen(str); if(str[1] == ' ')//“刻度说明”只有一个字符,后面紧跟空格 printf("UNIQUE\n"); else{ if(str[1] == '#'){ if(str[0] == 'G') printf("Ab");//G#可用Ab替换 else printf("%cb",str[0]+1); } else if(str[1] == 'b'){ if(str[0] == 'A') printf("G#");//Ab可用G#替换 else printf("%c#",str[0]-1); } for(i = 2;i<len;i++) printf("%c",str[i]);//随后的音调 printf("\n"); } } return 0; }
JAVA实现:
import java.util.*; class Main { public static void main(String[] args) throws Exception { Scanner cin = new Scanner(System.in); int c = 1; while (cin.hasNext()) { String a,b; a = cin.next(); b = cin.next(); System.out.print("Case " + c++ + ": "); if (2 > a.length()) System.out.println("UNIQUE"); else { if (a.charAt(1) == '#') { if (a.charAt(0) == 'G') System.out.print("Ab"); else System.out.print((char)(1 + a.charAt(0)) + "b"); } else if (a.charAt(1) == 'b') { if (a.charAt(0) == 'A') System.out.print("G#"); else System.out.print((char)(a.charAt(0) - 1) + "#"); } System.out.println(" " + b); } } } }
优秀代码,用了C++的string和求模运算:
/* 题目25优秀代码--运行号:298178 运行时间:2012-11-25 20:49:45 | 编程语言:C/C++ | 运行人:ACM_李如兵 */ #include<iostream> #include<string> using namespace std; string trans(string a){ string b=""; if(a[1]=='#'){ b+=char((a[0]-'A'+1)%7+'A'); b+='b'; }else{ b+=char((a[0]-'A'+6)%7+'A'); b+='#'; } return b; } int main(){ string a,b; for(int t=1; cin>>a>>b; t++){ cout<<"Case "<<t<<": "; if(a.length()==1) cout<<"UNIQUE"<<endl; else cout<<trans(a)<<" "<<b<<endl; } return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复