1 条题解
-
0
题目分析
本题描述了计算机存在的年份表示问题,一些计算机因用两位数字表示年份或用 32 位整数存储时间而出现日期跳转错误。给定多台计算机显示的年份 以及它们的错误情况(从 变为 ),需要找出第一个可能的真实年份,该年份要满足所有计算机的情况且不能早于任何一台计算机的 ,若不存在小于 10000 的这样的年份,则输出相应提示。
解题思路
- 理解题目条件:每台计算机有三个参数:显示年份 、错误年份 (当真实年份为 时显示为 )、错误发生年份 。真实年份 需满足对于每台计算机, 与 的关系要符合其错误规律,且 。
- 确定可能的年份范围:从所有计算机的 中找出最大值 ,真实年份 必定大于等于 。由于年份范围在 0 到 10000 之间,所以 的取值范围是 。
- 检查每个可能的年份:对于范围内的每个年份 ,检查它是否满足所有计算机的错误规律。对于每台计算机,计算 的差值 。如果 ,则 对应的显示年份应该是 ,检查这个显示年份是否等于 。如果对于所有计算机, 都满足上述条件,则 就是第一个可能的真实年份。
- 输出结果:如果找到符合条件的年份 ,输出 “Case #k: The actual year is z.”,其中 是测试用例编号, 是找到的真实年份。如果在 10000 以内没有找到符合条件的年份,输出 “Case #k: Unkown bugs detected.”。
代码实现
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; const int N = 10000; int cnt[N]; int main() { int n, y, a, b, caseno = 0; while(~scanf("%d", &n) && n) { memset(cnt, 0, sizeof(cnt)); for(int i = 1; i <= n; i++) { scanf("%d%d%d", &y, &a, &b); for(int j = y; j < N; j += b - a) cnt[j]++; } bool flag = false; for(int i = 0; i < N; i++) if(cnt[i] == n) { printf("Case #%d:\nThe actual year is %d.\n\n", ++caseno, i); flag = true; break; } if(flag == false) printf("Case #%d:\nUnknown bugs detected.\n\n", ++caseno); } return 0; }
- 1
信息
- ID
- 45
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者