题目解析
* 输入输出:第一行输入两个整数 NNN(储蓄罐数量,编号 000 到 N−1N-1N−1)和 DDD(总天数)。第二行输入 DDD 个整数 aia_iai ,表示第 iii 天往编号为 aia_iai 的储蓄罐存钱。输出 NNN 个整数,第 iii 个整数表示编号为 i−1i-1i−1 的储蓄罐中的总金额(即按 0,1,…,N−10,1,\dots,N-10,1,…,N−1 的顺序输出)。
* 数据范围:1≤N≤10001 \le N \le 10001≤N≤1000,1≤D≤10001 \le D \le 10001≤D≤1000,所有 aia_iai 满足 0≤ai≤N−10 \le a_i \le N-10≤ai ≤N−1。
* 复杂度要求:需遍历 DDD 天记录,时间复杂度 O(D)O(D)O(D),空间复杂度 O(N)O(N)O(N),远低于 1s1\text{s}1s 和 128MB128\text{MB}128MB 限制。
* 算法知识点:简单模拟、数组统计、单点累加
思路解析
1. 建立储蓄罐账户:创建一个大小为 NNN 的数组 arr(初始化为0),数组下标对应储蓄罐编号,值对应该储蓄罐的累计金额。代码中数组开至 200020002000 以确保不越界。
2. 按天处理存款:关键观察是第 iii 天存入的金额恰好为 iii 元(而非固定金额)。遍历天数 iii 从 111 到 DDD,读入当天目标储蓄罐编号 xxx,执行 arr[x] += i,将 iii 元累加到对应储蓄罐。
3. 顺序输出余额:最后顺序遍历编号 000 到 N−1N-1N−1,输出每个 arr[i] 即为该储蓄罐的最终金额。
完整代码