[JOI2025 预选赛 R1H2] 三角形 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求模拟反复对相邻元素求和并生成新序列的过程,每次操作后输出当前序列。
核心解法是直接按照题目描述进行迭代模拟,因为数据规模极小()。
分析
核心观察
每次操作将当前序列长度减少 ,新序列的第
项等于原序列第
项与第
项之和。整个过程可完全按定义逐轮模拟。
思路
设当前序列为 ,长度为
。一次操作后得到新序列
,其中
(
)。
执行 次操作,每次输出新序列。
由于 最大为
,直接使用数组或向量模拟即可,无需优化。
具体示例
样例 :初始
。
第 次:
,输出
。
第 次:
,输出
。
第 次:
,输出
。
第 次:
,输出
。
算法步骤
- 读入整数
和长度为
的序列
A。 - 循环执行
次:
- 创建一个空列表
B。 - 遍历
i从到
A.size() - 2,将A[i] + A[i+1]加入B。 - 将
A更新为B。 - 输出
A的所有元素,用空格分隔。
- 创建一个空列表
复杂度分析
- 时间复杂度:
,因为序列长度从
递减到
,总计算次数为
。
- 空间复杂度:
,存储当前序列和临时序列。
实现注意事项
- 每次操作后序列长度减
,循环次数固定为
。
- 输出时注意行末无多余空格(可用循环判断或使用分隔输出方式)。
- 数据范围小,整数运算不会溢出。
源代码
#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)))
评论