立志用更少的代码做更高效的表达
Pat乙级最优化代码+题解+分析汇总——>传送门
火星人是以 13 进制计数的:
地球人的 0 被火星人称为 tret。
地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
火星人将进位以后的 12 个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。
例如地球人的数字 29 翻译成火星文就是 hel mar;而火星文 elo nov 对应地球数字 115。为了方便交流,请你编写程序实现地球和火星数字之间的互译。
输入格式:
输入第一行给出一个正整数 N(<100),随后 N 行,每行给出一个 [0, 169) 区间内的数字 —— 或者是地球文,或者是火星文。
输出格式:
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。
输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13
解题思路
题意:让我们设计一个程序,能自由的完成火星文到地球数字的转换。
要注意转换时为13进制。
测试点2和测试点4:
注意读题:
也就是说:只有0能被称为tret(既然单独列出来作为一项规则,说明这个0是特殊的)。
如输入13,则输出tam。 而不是tam tret。
代码展示
#include<bits/stdc++.h>
using namespace std;
//地球文转化为火星文的映射
char a[13]={'0','1','2','3','4','5','6','7','8','9','a','b','c'};
map<char, string>m1, m2;
//火星文转化为地球文的映射
map<string, int>m3;
int b[300];
int main() {
m1['0'] = "tret";
m1['1'] = "jan"; m1['2'] = "feb"; m1['3'] = "mar"; m1['4'] = "apr";
m1['5'] = "may"; m1['6'] = "jun"; m1['7'] = "jly"; m1['8'] = "aug";
m1['9'] = "sep"; m1['a'] = "oct"; m1['b'] = "nov"; m1['c'] = "dec";
m2['1'] = "tam"; m2['2'] = "hel"; m2['3'] = "maa"; m2['4'] = "huh";
m2['5'] = "tou"; m2['6'] = "kes"; m2['7'] = "hei"; m2['8'] = "elo";
m2['9'] = "syy"; m2['a'] = "lok"; m2['b'] = "mer"; m2['c'] = "jou";
m3["dec"]= 12; m3["jou"]=12*13; m3["nov"]=11; m3["mer"]=11*13;
m3["lok"]= 10*13; m3["oct"]=10; m3["syy"]=9*13; m3["sep"]=9;
m3["elo"]=8*13; m3["aug"]=8; m3["hei"]=7*13; m3["jly"]=7;
m3["kes"]=6*13; m3["jun"]=6; m3["tou"]=5*13; m3["may"]=5;
m3["apr"]=4; m3["huh"]=4*13; m3["maa"]=3*13; m3["mar"]=3;
m3["hel"]=2*13; m3["feb"]=2; m3["tam"]=1*13; m3["jan"]=1;
m3["tret"]=0;
int n; cin>>n;
getchar(); //吸收空格,记住不要放到循环里
for(int i = 0; i < n; i++) {
string s;
getline(cin, s);
if(isalpha(s[0])) { //如果是字母
stringstream ss;
ss << s;
string s1,s2;
bool flag = false;
int num = 0; //累加和
while(ss >> s1) {
num += m3[s1];
}
cout << num << '\n';
} else { //如果是数字
stringstream ss; //把字符串转化成整型
int x;
ss << s; ss >> x;
string s1;
if(x < 13) {
s1 += a[x];
cout << m1[s1[0]] << '\n';
}
else {
s1 += a[x/13];
x = x % 13;
s1 += a[x];
cout << m2[s1[0]];
if(m1[s1[1]] != "tret") cout << ' ' << m1[s1[1]];
cout << '\n';
}
}
}
return 0;
}
博主的碎碎念:
这道题做了一个多小时,如果在正式比赛铁炸了。 主要的难点是测试点2与测试点4, 以及字符串和数字之间的映射问题。 如果单纯用if-else暴力判断,不需要考虑那么多的映射关系, 应该会更简单一些。 毕竟我们是为了拿高分, 又不是为了炫技~