1 条题解

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

    📝 题目大意

    NN 个人,每个人有一个编程能力值 PiP_i。求最小的非负整数 xx,使得 P1+xP_1 + x 严格大于其他所有人的能力值。即让第 11 个人成为唯一的最强者。

    💡 解题思路

    1. 题目分析

      • N100N \leq 100Pi100P_i \leq 100,数据范围极小,直接模拟即可。
      • 核心条件是 P1+x>PiP_1 + x > P_i 对所有 i1i \neq 1 成立,等价于 P1+x>maxi1PiP_1 + x > \max_{i \neq 1} P_i
      • P1P_1 已经严格大于其他所有人时,x=0x = 0
    2. 算法推导

      • 遍历 P2PNP_2 \sim P_N,求出最大值 max_val
      • 要使 P1+xP_1 + x 严格大于 max_val,最小需要 P1+x=max_val+1P_1 + x = \texttt{max\_val} + 1,即 x=max_val+1P1x = \texttt{max\_val} + 1 - P_1
      • P1P_1 已经大于 max_val,则 xx 可能为负,此时取 x=0x = 0。最终公式为 x = max(0, max_val + 1 - p[0])
    3. 边界与细节

      • N=1N = 1 时,没有其他人,循环不会执行,max_val 保持初始值 00。此时 x=max(0,0+1P1)x = \max(0, 0 + 1 - P_1)。由于 P11P_1 \ge 1x=0x = 0,符合预期(一个人自然是最强)。
      • 当所有 PiP_i 相等时(如样例 3),max_val 等于 P1P_1x=1x = 1,确保严格大于。
      • 注意是 严格大于>>),而非大于等于,所以需要 +1

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),只需一次遍历求最大值。
    • 空间复杂度O(N)O(N),存储数组 PP(也可优化至 O(1)O(1),但 N100N \le 100 无必要)。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        vector<int> p(n);
        for (int i = 0; i < n; i++) {
            cin >> p[i];
        }
        // 求除第1个人外其他人的最大能力值
        int max_val = 0;
        for (int i = 1; i < n; i++) {
            max_val = max(max_val, p[i]);
        }
        // 需要 P1 + x > max_val,即 x = max_val + 1 - P1,且 x >= 0
        int x = max(0, max_val + 1 - p[0]);
        cout << x << endl;
        return 0;
    }
    
    • 1

    信息

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