思路:
就是一个递推一个,我们需要计算的是E相距B的距离绝对值,但是这样的条件并不是一次给出的,所以我们需要不断的递推,先维护先描述的牛牛距离关系,例如牛A是在B前面Dog年出生的,所以在B的距离是((0 - 9) % 12 + 12) % 12 = 3,所以距离是 0 - 3 = -3,即我们每次维护的hash表d维护的是与B牛的距离关系,表示牛A在B的前面的Dog年出生,E 在 A 的后面的虎年出生,这样答案是 B 在牛年,E在虎年,答案相差1年,
我们计算E与A的关系:
((1 - -3 ) % 12 + 12) % 12 = 4,所以答案是 4 + - 3 = 1。最后的答案是对E与B关系的绝对值,因为E牛可能在B牛的前面,但是答案要求算绝对值。
代码:
#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;
unordered_map<string,int> 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}
};
int n;
int main(){
cin>>n;
string p[8];
unordered_map<string,int> d;//相对位置
d["Bessie"] = 0;
while(n--){
for(int i = 0;i < 8;i++) cin>>p[i];
if(p[3] == "previous"){
//x是 后面牛的位置 y 是前面牛生效的位置
int x = d[p[7]], y = id[p[4]];
int r = ((x - y)%12 + 12) % 12;
if(!r) r = 12;
d[p[0]] = x - r;
}
//在后面的年份
else{
//x是 后面牛的位置 y 是前面牛生效的位置
int x = d[p[7]], y = id[p[4]];
int r = ((y - x)%12 + 12) % 12;
if(!r) r = 12;
d[p[0]] = x + r;
}
}
cout<<abs(d["Elsie"])<<endl;
return 0;
}
评论区