1 条题解
-
0
📝 题目大意
有 个人,每个人有一个编程能力值 。求最小的非负整数 ,使得 严格大于其他所有人的能力值。即让第 个人成为唯一的最强者。
💡 解题思路
-
题目分析:
- ,,数据范围极小,直接模拟即可。
- 核心条件是 对所有 成立,等价于 。
- 当 已经严格大于其他所有人时,。
-
算法推导:
- 遍历 ,求出最大值
max_val。 - 要使 严格大于
max_val,最小需要 ,即 。 - 若 已经大于
max_val,则 可能为负,此时取 。最终公式为x = max(0, max_val + 1 - p[0])。
- 遍历 ,求出最大值
-
边界与细节:
- 当 时,没有其他人,循环不会执行,
max_val保持初始值 。此时 。由于 ,,符合预期(一个人自然是最强)。 - 当所有 相等时(如样例 3),
max_val等于 ,,确保严格大于。 - 注意是 严格大于(),而非大于等于,所以需要
+1。
- 当 时,没有其他人,循环不会执行,
⏱️ 复杂度分析
- 时间复杂度:,只需一次遍历求最大值。
- 空间复杂度:,存储数组 (也可优化至 ,但 无必要)。
💻 标准代码 (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
- 上传者