题目难度:二星
考察点:模拟

方法:模拟

  1. 分析:
    按照题意模拟,然后将出现的时间全部转化为数字,上课时间-路上耽误的时间=最晚起床时间,然后根据闹钟的时间早晚找到最晚起床时间,如果将闹钟时间转化为分钟数的值小于等于最晚起床时间转化为的分钟数,那么此时这个闹钟就可以作为起床时间可用,然后找到最晚的闹钟时间。

算法实现:
(0). 对于题目中所出现的时间概念,全部转化为分钟表示的数字,数字越小代表的时间越早,数字越大表示时间越晚,例如:A时B分可以转化为data = A*60+B。
(1). 那么我们就可以遍历闹钟序列,然后判断是否满足如果从当前闹钟开始需要x分钟到达教室不迟到的条件
(2). 如果满足不迟到的条件,就更新结果的最大值(因为数字越大,表示时间越晚)
(3). 最后输出 ans/60和ans%60即可。ans/60表示时分,ans%60表示分钟。

  1. 复杂度分析:
    时间复杂度:O(n)
    空间复杂度:O(n)

  2. 代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int MAXN = 105;
    struct Node {
     int H, M, data;
    }a[MAXN];
    int main() {
     int n; cin>>n;
     for(int i=0; i<n; i++) {
         cin>>a[i].H>>a[i].M;
         a[i].data = a[i].H*60+a[i].M;
     }
     int x, A, B; cin>>x>>A>>B;
     int tmp = A*60+B, ans = 0;
     for(int i=0; i<n; i++) {
         if(a[i].data+x <= tmp) {
             ans = max(ans, a[i].data);
         }
     }
     cout<<ans/60<<" "<<ans%60<<endl;
     return 0;
    }