原题链接:题目25 - ACM在线评测系统

时间限制:1000 ms  |  内存限制:65535 KB

难度:1

描述

巴赫先生是一位著名的音乐作曲家。他最著名的作品之一是他那套前奏曲。这24片跨越24个音乐键(有音乐的12个不同刻度说明,每个能取大调或小调)。这12个有区别的“刻度说明”如下:

AA#=BbBCC#=DbDD#=EbEFF#=GbGG#=Ab

五个说明正如上面用等号表示的,有两个可替换的名字。因此,这些刻度说明有17个(12+5)可能的名字,但是仅有12个说明在音乐上有区别。在使用其中之一作为音乐键的基调时,我们能更进一步区分音调的大调(major)和小调(minor)。这便给出了34个(17*2)可能键,其中有24个(12*2)在音乐上有区别。 在为他的前奏曲命名时,巴赫先生使用了除下面所示的10个之外所有键,这10个键的命名被可替换的名字替代:

Ab minorA# majorA# minorC# majorDb minor
D# majorD# minorGb majorGb minorG# 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;
}


点赞(3)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论