1 条题解

  • 0
    @ 2025-5-10 11:13:30

    题目分析

    本题描述了计算机存在的年份表示问题,一些计算机因用两位数字表示年份或用 32 位整数存储时间而出现日期跳转错误。给定多台计算机显示的年份 yiy_i 以及它们的错误情况(从 bib_i 变为 aia_i),需要找出第一个可能的真实年份,该年份要满足所有计算机的情况且不能早于任何一台计算机的 aia_i,若不存在小于 10000 的这样的年份,则输出相应提示。

    解题思路

    1. 理解题目条件:每台计算机有三个参数:显示年份 yiy_i、错误年份 aia_i(当真实年份为 bib_i 时显示为 aia_i)、错误发生年份 bib_i。真实年份 xx 需满足对于每台计算机,xxyiy_i 的关系要符合其错误规律,且 xmax{ai}x \geq \max\{a_i\}
    2. 确定可能的年份范围:从所有计算机的 aia_i 中找出最大值 maxamax_a,真实年份 xx 必定大于等于 maxamax_a。由于年份范围在 0 到 10000 之间,所以 xx 的取值范围是 [maxa,10000)[max_a, 10000)
    3. 检查每个可能的年份:对于范围内的每个年份 xx,检查它是否满足所有计算机的错误规律。对于每台计算机,计算 xbix - b_i 的差值 diffdiff。如果 diff0diff \geq 0,则 xx 对应的显示年份应该是 ai+diffa_i + diff,检查这个显示年份是否等于 yiy_i。如果对于所有计算机,xx 都满足上述条件,则 xx 就是第一个可能的真实年份。
    4. 输出结果:如果找到符合条件的年份 xx,输出 “Case #k: The actual year is z.”,其中 kk 是测试用例编号,zz 是找到的真实年份。如果在 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
    上传者