题目描述
给定$n$个两头牛之间的出生关系,$a$在$b$的前或后$12$年中的$x$年出生,这里的$x$用$a,b$的生肖和出生前后顺序计算。
题解
- 将生肖排列顺序转化为$0-11$的数字,方便计算$a,b$出生年份的差值
- 题目给定的是$a$是$b$前后某个生肖出生,所以我们需要记录查询$b$的年龄和生肖,用$b$的年龄和生肖来计算$a$的年龄
- 在2中提到了年龄,题目没有给定这个参数,我们指定$Bessie$的年龄为$0$,其他牛的年龄计算与$Bessie$的相对值即可
C++ 代码
#include <iostream>
#include <unordered_map>
#include <cmath>
using namespace std;
int n;
//age记录每头牛与Bessie的相对年龄
//ord是order的简写,记录的是从牛到鼠的生肖到0-12的映射
unordered_map<string, int> age, ord = {{"Ox", 0}, {"Tiger", 1}, {"Rabbit", 2}, {"Dragon", 3}, {"Snake", 4}, {"Horse", 5}, {"Goat", 6}, {"Monkey", 7}, {"Rooster", 8}, {"Dog", 9}, {"Pig", 10}, {"Rat", 11}};
//na是name-animal的映射,记录每头牛的生肖
unordered_map<string, string> na;
int main() {
cin >> n;
na["Bessie"] = "Ox";
age["Bessie"] = 0; //初始化Bessie生肖为Ox,年龄为0
while (n--) {
//ind表示increase-decrease,记录a是在b的前还是后出生,ani表示animal,是a的生肖,tmp用来读取无用字符串
string a, ind, ani, b, tmp;
cin >> a >> tmp >> tmp >>ind >> ani >> tmp >> tmp >> b;
//记录a的生肖
na[a] = ani;
//如果a和b生肖相同的话,判断是先还是后出生,在b的年龄基础上加减12
if (ani == na[b]) age[a] = (ind == "previous" ? age[b] - 12 : age[b] + 12);
//不是同样的生肖的话,用后出生者的生肖序号减去先出生者的生肖序号,模12取正值即为a,b的年龄差值,再用b的年龄加减这个年龄差值即为a的年龄
else age[a] = (ind == "previous" ? age[b] - ((ord[na[b]] - ord[ani] + 12) % 12) : age[b] + ((ord[ani] - ord[na[b]] + 12) % 12));
}
//输出Elsie年龄的绝对值,因为我们把Bessie的年龄记为0,所以直接打印Elsie年龄的绝对值就是这两者的年龄差值
cout << abs(age["Elsie"]) << endl;
return 0;
}
关键代码
age[a] = (ind == "previous" ? age[b] - ((ord[na[b]] - ord[ani] + 12) % 12) : age[b] + ((ord[ani] - ord[na[b]] + 12) % 12));
提取其中的这一段age[b] - ((ord[na[b]] - ord[ani] + 12) % 12
na[b]
是$b$的生肖,ord[na[b]]
$b$的生肖的序号,ord[ani]
是$a$的生肖的序号,age[b]
是$b$的年龄
这段代码表示在$b$比$a$后出生的情况下,$a,b$年龄的差值
其中+12
和%12
是为了解决$a$的生肖编号在$b$的生肖编号前面的情况
y的看不懂 这个可以啊
您好,我想请教一下,请问我的代码哪里错了?#include[HTML_REMOVED]
#include[HTML_REMOVED]
#include[HTML_REMOVED]
#include[HTML_REMOVED]
#include [HTML_REMOVED]
using namespace std;
int main(){
unordered_map[HTML_REMOVED]age,id={
{“Ox”, 0}, {“Tiger”, 1}, {“Rabbit”, 2}, {“Dragon”, 3}, {“Snake”, 4},
{“Horse”, 5}, {“Goat”, 6}, {“Monkey”, 7}, {“Rooster”, 8}, {“Dog”, 9},
{“Pig”, 10}, {“Rat”, 11}
};
unordered_map[HTML_REMOVED]x;
string Bessie;
x[Bessie]=”Ox”;
age[Bessie]=0;
int n;
string a,s,b,xu,c;
cin>>n;
while(n–){
cin>>a>>s>>s>>xu>>c>>s>>s>>b;
x[a]=c;
if(c==x[b]) {
if(xu==”previous”) age[a]=age[b]-12;
else age[a]=age[b]+12;
}
else{
if(xu==”previous”) age[a]=age[b]-((id[x[b]]-id[c]+12)%12);
else age[a]=age[b]+((id[c]-id[x[b]]+12)%12);
}
}
cout<<abs(age[“Elsie”])<<endl;
return 0;
}
Bessie处语法问题
好的,谢谢大佬
真的佩服,谢谢讲解
y总是不是参考了你的代码,好像
哈哈,当你是夸我了,都是跟y总学的,所以有些像。
tql
牛皮
给我点个赞呗
https://www.acwing.com/solution/content/43151/
点了hh~
谢谢
tql