题目解析
* 输入输出:第一行输入整数 nnn 表示小朋友数量,第二行输入 nnn 个正整数 aia_iai 表示每位小朋友的最小需求。输出最少需要的糖果总数。
* 数据范围:1≤n≤10001 \le n \le 10001≤n≤1000,1≤ai≤1091 \le a_i \le 10^91≤ai ≤109。注意结果可能超过 323232 位整数范围(如样例2所示)。
* 复杂度要求:时间复杂度 O(n)O(n)O(n),空间复杂度 O(1)O(1)O(1),需使用 646464 位整数(long long)存储结果。
* 算法知识点:贪心算法、序列处理、数据范围分析
思路解析
1. 问题建模:设第 iii 位小朋友实际获得 bib_ibi 颗糖果,需满足:bi≥aib_i \ge a_ibi ≥ai (最小需求),且 bi>bi−1b_i > b_{i-1}bi >bi−1 (严格递增,即 bi≥bi−1+1b_i \ge b_{i-1} + 1bi ≥bi−1 +1)。
2. 贪心策略:为使总和最小,每位小朋友在满足约束前提下应取最小可能值。对于第 iii 位,bi=max(ai,bi−1+1)b_i = \max(a_i, b_{i-1} + 1)bi =max(ai ,bi−1 +1),即同时满足自身最小需求和比前一位多 111 的要求。
3. 递推实现:维护变量 pre_num\textit{pre\_num}pre_num 表示前一位小朋友实际获得的糖果数(初始为 −1-1−1,确保第一位至少取 a1a_1a1 )。遍历每位小朋友时,计算当前分配值 cur=max(ai,pre_num+1)\textit{cur} = \max(a_i, \textit{pre\_num} + 1)cur=max(ai ,pre_num+1),累加至总和,并更新 pre_num\textit{pre\_num}pre_num。
4. 数据类型选择:由于 n≤1000n \le 1000n≤1000 且 ai≤109a_i \le 10^9ai ≤109,最坏情况下总和可能超过 2×1092 \times 10^92×109(如样例2),必须使用 long long 避免溢出。
完整代码