数组统计与存款账户算法实现详解

1. 题目解析与算法思路

这道题目描述了一个简单的统计问题:给定n个账户(编号0到n-1)和d天的存款记录,每天会有一笔钱存入某个账户,我们需要统计每个账户最终的总存款金额。题目给出的C++代码已经实现了这个功能,但我们需要深入理解其背后的算法逻辑和实现细节。

1.1 问题重述

输入格式:

  • 第一行两个整数n和d,表示账户数量和存款天数
  • 接下来d行,每行一个整数sum,表示当天存款存入的账户编号

输出格式:

  • 一行n个整数,表示每个账户的最终存款总额,用空格分隔

1.2 核心算法分析

代码使用了最简单的"计数"算法:

  1. 初始化一个大小为n的数组a,所有元素初始值为0
  2. 对于每一天的存款:
    • 读取账户编号sum
    • 将当天的天数i加到a[sum]上
  3. 最后输出数组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循环,表

内容推荐

已经到底了哦
已经到底了哦