1 条题解

  • 0
    @ 2026-6-19 10:30:30

    📝 题目大意

    给定 NN 个递增的点击时刻 T1<T2<<TNT_1 < T_2 < \dots < T_N,以及一个时间间隔 DD。若存在相邻两次点击满足 Ti+1TiDT_{i+1} - T_i \le D,则称在 Ti+1T_{i+1} 时刻成功双击。求首次成功双击的时刻,若不存在则输出 1-1

    💡 解题思路

    1. 题目分析N100N \le 100,数据量极小,且 TiT_i 已按升序给出。由于"双击"只关心相邻两次点击,只需要顺序扫描即可。
    2. 算法推导:遍历 ii00N2N-2,检查 Ti+1TiDT_{i+1} - T_i \le D。一旦找到满足条件的相邻对,直接输出 Ti+1T_{i+1}(即第二次点击的时刻)并结束程序。若遍历完仍未找到,输出 1-1
    3. 边界与细节
      • N=1N=1 时,循环条件 i < N-1 不成立,不会进入循环,直接输出 1-1,符合题意。
      • 差值可能很大(D,TiD, T_i 最大 10910^9),使用 int23112.1×1092^{31}-1 \approx 2.1 \times 10^9)足够存储,不会溢出。
      • 题目要求输出第一次成功双击的时刻,因此找到第一个满足条件的对就立即输出并返回,无需继续遍历。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),只需一次线性扫描。
    • 空间复杂度O(N)O(N),存储 NN 个点击时刻。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int N, D;
        cin >> N >> D;
        vector<int> T(N);
        for (int i = 0; i < N; i++) {
            cin >> T[i];
        }
        // 遍历相邻点击对,检查是否构成双击
        for (int i = 0; i < N - 1; i++) {
            if (T[i + 1] - T[i] <= D) {
                // 找到第一个满足条件的双击,输出第二次点击的时刻
                cout << T[i + 1] << endl;
                return 0;
            }
        }
        // 没有找到任何双击
        cout << -1 << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    700
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者