1 条题解

  • 0
    @ 2025-5-22 20:02:26

    分析题意与解题方法

    题目背景

    给定一个二维数组 arr 和两个变量 kn,程序通过多次嵌套循环计算了数组中某些元素的值,并最终输出某个特定列的总和。


    代码功能分解

    初始化部分 (ini() 函数)

    1. 定义了一个二维数组 arr,大小为 5×Maxn5 \times \text{Maxn}
    2. 清空数组的所有元素为 00
    3. 嵌套循环填充数组的部分值:
      • 第二行 (arr[2]arr[2]) 的每个元素通过公式 arr[2][i]+=min(i,j)+1\text{arr}[2][i] += \min(i, j) + 1 累加。
      • 第三行 (arr[3]arr[3]) 的每个元素通过公式 $\text{arr}[3][i] += (\min(i, j) + 1) \cdot \text{arr}[2][j]$ 累加。
      • 第四行 (arr[4]arr[4]) 的每个元素通过公式 $\text{arr}[4][i] += (\min(i, j) + 1) \cdot \text{arr}[3][j]$ 累加。

    主函数部分

    1. 循环读取输入的 nnkk,直到文件结束。
    2. 调用 ini() 函数初始化数组。
    3. 计算第 nn 行所有元素的总和,并输出结果。

    关键公式推导

    第二行计算

    $$\text{arr}[2][i] = \sum_{j=0}^{k-1} (\min(i, j) + 1) $$

    解释:

    • 对于固定的 iimin(i,j)\min(i, j) 表示 iijj 中较小的那个值,加上 11 后累加。

    第三行计算

    $$\text{arr}[3][i] = \sum_{j=0}^{k-1} (\min(i, j) + 1) \cdot \text{arr}[2][j] $$

    解释:

    • 第三行依赖第二行的结果,通过逐项乘积后求和。

    第四行计算

    $$\text{arr}[4][i] = \sum_{j=0}^{k-1} (\min(i, j) + 1) \cdot \text{arr}[3][j] $$

    解释:

    • 第四行依赖第三行的结果,同样通过逐项乘积后求和。

    总和计算

    最终需要计算第 nn 行的总和:

    sum=i=0k1arr[n][i]\text{sum} = \sum_{i=0}^{k-1} \text{arr}[n][i]

    解题方法总结

    1. 输入解析:每次读取 nnkk
    2. 初始化数组:调用 ini() 函数,按公式逐步填充数组。
    3. 计算总和:对第 nn 行的所有元素求和并输出。

    示例运行

    假设输入如下:

    2 3
    

    程序会依次计算 arr[2],arr[3],arr[4]arr[2], arr[3], arr[4],然后输出第 22 行的总和。


    代码展示

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    
    #define Min(a1, b1) ((a1) > (b1) ? (b1) : (a1))
    using namespace std;
    
    const int Maxn = 5010;
    long long arr[5][Maxn];
    int k, n;
    
    void ini() {
        memset(arr, 0, sizeof(arr));
        for (int i = 0; i < k; ++i) {
            for (int j = 0; j < k; ++j) {
                arr[2][i] += Min(i, j) + 1;
            }
        }
        for (int i = 0; i < k; ++i) {
            for (int j = 0; j < k; ++j) {
                arr[3][i] += (Min(i, j) + 1) * arr[2][j];
            }
        }
        for (int i = 0; i < k; ++i) {
            for (int j = 0; j < k; ++j) {
                arr[4][i] += (Min(i, j) + 1) * arr[3][j];
            }
        }
    }
    
    int main(void) {
        while (scanf("%d%d", &n, &k) != EOF) {
            ini();
            long long sum = 0;
            for (int i = 0; i < k; ++i) {
                sum += arr[n][i];
            }
            cout << sum << endl;
        }
        return 0;
    }
    • 1

    信息

    ID
    1159
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者