#P1044. Date bugs
Date bugs
描述
有传言称,很多计算机存在与 2000 年相关的问题。由于它们仅用两位数字表示年份,日期会突然从 1999 年变为 1900 年。实际上,还有许多其他类似的问题。在某些系统中,使用 32 位整数来存储从某个固定日期开始经过的秒数。按照这种方式,当经过\(2^{32}\)秒(约 136 年)时,日期会跳回到那个固定日期。
那么,对于所有这些混乱情况该怎么办呢?假设你有两台计算机\(C1\)和\(C\),它们存在两种不同的错误:一台存在普通的 Y2K 错误(即从 2000 年变为\(a1 = 1900\)),另一台在 2040 年时会变为\(a2 = 1904\)。假设\(C1\)显示的年份\(y1 = 1941\),\(C2\)显示的年份\(y2 = 2005\)。那么你知道以下情况(假设不存在其他错误):真实年份不可能是 1941 年,因为在那种情况下,两台计算机都会显示(相同的)正确日期。如果年份是 2005 年,\(y1\)会是 1905 年,所以这也不可能。仅看\(C1\),我们知道真实年份是以下年份之一:1941 年、2041 年、2141 年等等。现在我们可以计算出\(C2\)在这些年份会显示的年份:1941 年、1905 年、2005 年等等。所以实际上,真实年份可能是 2141 年。
手动计算所有这些情况工作量很大。(而且你肯定不想每次忘记真实年份时都去计算。)所以,你的任务是编写一个程序来为你进行计算:在知道其他计算机显示的年份\(yi\)以及它们的错误情况(从\(bi\)变为\(ai\))的情况下,找到第一个可能的真实年份。请注意,年份\(ai\)肯定不会在计算机制造年份之后。由于真实年份不能早于计算机的制造年份,你要找的年份不能早于任何一个\(ai\)。
输入
输入文件包含多个测试用例,需要计算每个测试用例的真实年份。每个测试用例的描述从包含整数\(n\)(\(1 \leq n \leq 20\))的一行开始,\(n\)表示计算机的数量。然后,对于每台计算机,有一行包含三个整数\(yi\)、\(ai\)、\(bi\)(\(0 \leq ai \leq yi \leq bi < 10000\))。\(yi\)是计算机显示的年份,\(bi\)是出现错误的年份(即计算机无法显示的第一个年份),\(ai\)是计算机在\(bi\)年份时显示的年份。
输入以\(n = 0\)的测试用例结束,该测试用例不进行处理。
输出
对于每个测试用例,输出一行“Case #k:”,其中\(k\)是测试用例的编号。然后,输出一行“The actual year is z.”,其中\(z\)是最小的可能年份(满足所有计算机的情况且大于或等于\(u\))。如果不存在小于 10000 的这样的年份,则输出“Unkown bugs detected.”。在每个测试用例后输出一个空行。
2
1941 1900 2000
2005 1904 2040
2
1998 1900 2000
1999 1900 2000
0
Case #1:
The actual year is 2141.
Case #2:
Unknown bugs detected.
来源
1999 年中欧地区竞赛