[JOI2025 预选赛 R1H2] 三角形 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求模拟反复对相邻元素求和并生成新序列的过程,每次操作后输出当前序列。
核心解法是直接按照题目描述进行迭代模拟,因为数据规模极小(N \le 10)。

分析
核心观察

每次操作将当前序列长度减少 1,新序列的第 i 项等于原序列第 i 项与第 i+1 项之和。整个过程可完全按定义逐轮模拟。

思路

设当前序列为 A,长度为 L。一次操作后得到新序列 B,其中 B_i = A_i + A_{i+1}(1 \le i < L)。
执行 N-1 次操作,每次输出新序列。
由于 N 最大为 10,直接使用数组或向量模拟即可,无需优化。

具体示例

样例 1:初始 [1,3,5,7,9]。
第 1 次:1+3=4, 3+5=8, 5+7=12, 7+9=16,输出 4 8 12 16。
第 2 次:4+8=12, 8+12=20, 12+16=28,输出 12 20 28。
第 3 次:12+20=32, 20+28=48,输出 32 48。
第 4 次:32+48=80,输出 80。

算法步骤
  1. 读入整数 N 和长度为 N 的序列 A。
  2. 循环执行 N-1 次:
    • 创建一个空列表 B。
    • 遍历 i 从 0 到 A.size() - 2,将 A[i] + A[i+1] 加入 B。
    • 将 A 更新为 B。
    • 输出 A 的所有元素,用空格分隔。
复杂度分析
  • 时间复杂度:O(N^2),因为序列长度从 N 递减到 1,总计算次数为 N(N-1)/2。
  • 空间复杂度:O(N),存储当前序列和临时序列。
实现注意事项
  • 每次操作后序列长度减 1,循环次数固定为 N-1。
  • 输出时注意行末无多余空格(可用循环判断或使用分隔输出方式)。
  • 数据范围小,整数运算不会溢出。
源代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<int> A(N);
    for (int i = 0; i < N; ++i) cin >> A[i];
    for (int step = 0; step < N - 1; ++step) {
        vector<int> B;
        B.reserve(A.size() - 1);
        for (size_t i = 0; i + 1 < A.size(); ++i) {
            B.push_back(A[i] + A[i + 1]);
        }
        A = B;
        for (size_t i = 0; i < A.size(); ++i) {
            if (i) cout << ' ';
            cout << A[i];
        }
        cout << '\n';
    }
    return 0;
}
N = int(input())
A = list(map(int, input().split()))
for _ in range(N - 1):
    B = []
    for i in range(len(A) - 1):
        B.append(A[i] + A[i + 1])
    A = B
    print(' '.join(map(str, A)))

评论

目前没有评论。