USACOW之牛年

题目描述

Farmer John 的奶牛们得知最近正在庆祝牛年的到来时十分兴奋。

牛年总是奶牛们的最爱。

我们知道,中国历法中每一年所对应的生肖遵循 1212 年的周期:Ox, Tiger, Rabbit, Dragon, Snake, Horse, Goat, Monkey, Rooster, Dog, Pig, Rat(牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪、鼠),然后回到牛。

奶牛 Bessie 自豪地说她是在许多年前的一个牛年出生的。

她的朋友 Elsie 想要知道她与 Bessie 出生相差多少年,并且希望你能够通过查看农场上若干奶牛出生年份之间的关系来帮助她推算。

输入格式

输入的第一行包含一个整数 N。

以下 N 行每行包含一个 8 个单词的短语,指定了两头奶牛的出生年份之间的关系,格式为 Mildred born in previous Dragon year from Bessie(Mildred 在 Bessie 出生的前一个龙年出生),或 Mildred born in next Dragon year from Bessie(Mildred 在 Bessie 出生的后一个龙年出生)。

最后一个单词是农场上某一头奶牛的名字,为 “Bessie” 或一头已经在之前的输入中出现过的奶牛。

第一个单词是农场上某一头奶牛的名字,不为 “Bessie” 且未在之前的输入中出现过。

所有的奶牛名字不超过 10 个字符,且仅包含字符 a…z 或 A…Z。

第 5 个单词是上述十二生肖之一。

第 4 个单词是 previous(之前)或 next(之后)之一。

例如,如果短语为 Mildred born in previous Dragon year from Bessie,则 Mildred 的出生年份为最为接近且严格处于 Bessie 的出生年份之前(不等于)的龙年。

下一行包含一个小写字母组成的字符串,为 Farmer John 听到 Bessie 唱的字母。

输出格式

输出 Bessie 和 Elsie 的出生年份之间相差的年数。输入保证可以通过给定的信息求出结果。

数据范围

1 ≤ N ≤ 100 1≤N≤100 1N100

样例
输入样例
4
Mildred born in previous Dragon year from Bessie
Gretta born in previous Monkey year from Mildred
Elsie born in next Ox year from Gretta
Paulina born in next Dog year from Bessie
输出样例
12
样例解释

在以上的输入中,

  • Elsie 在 Bessie 之前 12 12 12 年出生。
  • Mildred 在 Bessie 之前 9 9 9 年出生。
  • Gretta 在 Bessie 之前 17 17 17 年出生。
  • Paulina 在 Bessie 之后 9 9 9 年出生。

思路

通过计算生肖年来计算两头牛之间数字相差多少。我们在这里求的是相对值,所以在这里可以把bessie出生的年份定为 0 年(比较简单),题目中给出的信息是可以通过年份计算,可以算出相差多少年。所以每一头牛的年份一定是可以确定的。
我们可以再生肖中规定牛对应数字 0,剩下的依次是1 2 3 … 11,另外存储每一个牛的值,可以用哈希表unordered_map来存储。

  1. previous的情况下:
    牛年

在previous的情况下,y是在x的前面,所以x 和 y 之间的差值可以计算为 r = x - y

  1. next的情况下:
    在这里插入图片描述

在next的情况下,y是在x的后面,所以x 和 y 之间的差值可以计算为 r = y - x, 又因为计算出来的数字只能在0 - 11 之间,所以 距离 r = (y - x) % 12, 要特别注意可能会出现负数, 所以我们需要使用((y - x) % 12 + 12) % 12,先加 12 在模 12 ,这样得到的值就是正数。(小技巧)
最后输出Elsie和Bessie之间的差值就可以。

C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>

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 main()
{
    unordered_map<string, int> p;
    p["Bessie"] = 0;

    int n;
    cin >> n;
    
    while (n --)
    {
        string s[8];
        for (int i = 0; i < 8; i ++ ) cin >> s[i];
        
    
        if (s[3] == "previous")
        {
            int x = p[s[7]], y = id[s[4]]; // x 代表已知的那头牛, y 代表该段话的生肖年份
            int r = ((x - y) % 12 + 12) % 12; // 模的值可能有负数, 所以需要 先 + 12 再 % 12,这样就一定是正的。
            if (r == 0) r = 12; // 如果是0,代表刚好是一轮,特判一下 r = 12
            p[s[0]] = x - r; // 给新牛赋值
        }
        else if (s[3] == "next")
        {
            int x = p[s[7]], y = id[s[4]]; // x 代表已知的那头牛, y 代表该段话的生肖年份
            int r = ((y - x) % 12 + 12) % 12;
            if (r == 0) r = 12;
            p[s[0]] = x + r; // 给新牛赋值
        }
     
    }
    
    cout << abs(p["Elsie"] - p["Bessie"]) << endl;
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值