1. 题目解析与算法思路
这道题目描述了一个简单的统计问题:给定n个账户(编号0到n-1)和d天的存款记录,每天会有一笔钱存入某个账户,我们需要统计每个账户最终的总存款金额。题目给出的C++代码已经实现了这个功能,但我们需要深入理解其背后的算法逻辑和实现细节。
1.1 问题重述
输入格式:
- 第一行两个整数n和d,表示账户数量和存款天数
- 接下来d行,每行一个整数sum,表示当天存款存入的账户编号
输出格式:
- 一行n个整数,表示每个账户的最终存款总额,用空格分隔
1.2 核心算法分析
代码使用了最简单的"计数"算法:
- 初始化一个大小为n的数组a,所有元素初始值为0
- 对于每一天的存款:
- 读取账户编号sum
- 将当天的天数i加到a[sum]上
- 最后输出数组a的所有元素
这个算法的巧妙之处在于:
- 使用数组下标直接对应账户编号,实现了O(1)时间的存取
- 将天数i作为存款金额,这样总存款额实际上就是各账户被存款的天数之和
1.3 时间复杂度分析
- 初始化数组:O(n)
- 处理d天的存款记录:O(d)
- 输出结果:O(n)
总时间复杂度为O(n + d),对于题目给定的数据范围(n≤1000,d≤1000)来说非常高效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现详解
让我们逐行解析给出的C++代码,理解每个细节的实现原理。
2.1 头文件与命名空间
cpp复制#include <bits/stdc++.h>
using namespace std;
这是竞赛编程中常见的写法:
<bits/stdc++.h>是GCC编译器提供的万能头文件,包含了所有标准库using namespace std允许直接使用标准库中的名称(如cin, cout等)
注意:在实际工程项目中不建议使用这种写法,但在竞赛编程中可以节省时间。
2.2 数组定义与初始化
cpp复制int a[1000];
这里定义了一个全局数组a,大小为1000:
- 全局变量会自动初始化为0
- 题目保证n≤1000,所以这个大小足够
- 数组下标0到n-1对应账户编号
2.3 主函数框架
cpp复制int main() {
int n,d;
cin>>n>>d;
// 处理存款记录
// 输出结果
return 0;
}
标准的主函数结构,读取n和d后进行处理。
2.4 存款记录处理
cpp复制for(int i=1; i<=d; i++) {
int sum=0;
cin>>sum;
a[sum]+=i;
}
关键处理逻辑:
- i从1到d循环,表
