1 条题解
-
0
📝 题目大意
有 种元素,第 种元素有 个,编号为 。两个元素 和 合成时,若 则结果为 ,否则结果为 (即合成规则对称)。从元素 开始,依次与元素 合成,输出最终得到的元素编号。
💡 解题思路
-
题目分析:,数据范围很小,直接模拟即可。合成规则的关键在于对称性:无论 和 的大小关系如何,合成结果只取决于 这一对编号,且总是取较大索引作为行、较小索引作为列去查 。
-
算法推导:
- 定义 表示元素 与元素 合成的结果(其中 )。
- 输入时只给出 的情况(即三角矩阵),std.cpp 在读取时同时赋值
a[j][i] = a[i][j],将矩阵补全为对称矩阵,这样后续查询时不用关心下标大小。 - 设当前元素为
ans,初始为 (因为从元素 开始)。 - 依次遍历 ,每次将当前元素
ans与元素 合成:ans = a[ans][i]。由于矩阵已对称,无论ans与 谁大谁小,a[ans][i]都能正确返回合成结果。 - 最终
ans即为答案。
-
边界与细节:
- 注意输入格式为三角形,第 行有 个数,读取时用双重循环
j=1到i。 - 矩阵下标从 开始,建议数组开 大小避免越界。
- 合成序列中第一个元素既是 也是 号元素与自身的合成,即
ans = a[1][1],这自然包含在循环中。
- 注意输入格式为三角形,第 行有 个数,读取时用双重循环
⏱️ 复杂度分析
- 时间复杂度:,其中 ,输入读取为 ,模拟过程为 。
- 空间复杂度:,用于存储对称矩阵 。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; const int N = 110; int a[N][N]; // 对称矩阵,a[i][j] 表示元素 i 与 j 合成的结果 int main() { int n; scanf("%d", &n); // 读入三角矩阵并补全为对称矩阵 for (int i = 1; i <= n; i++) for (int j = 1; j <= i; j++) { scanf("%d", &a[i][j]); a[j][i] = a[i][j]; // 利用对称性补全,使 a[x][y] 在任意 x,y 下都合法 } int ans = 1; // 初始元素为 1 // 依次与元素 1, 2, ..., n 合成 for (int i = 1; i <= n; i++) ans = a[ans][i]; // 当前元素与元素 i 合成 printf("%d\n", ans); return 0; } -
- 1
信息
- ID
- 824
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者