1 条题解
-
0
📝 题目大意
给定两个整数 和 ,求有多少个整数 ,使得 三个数可以排列成一个等差数列(即存在一种排列 满足 )。
💡 解题思路
-
题目分析: 的范围仅 ,数据量极小。三个数能构成等差数列的充要条件是:排序后,中间数等于两边数的平均值,即相邻两数之差相等。
-
算法推导:
- 由于 , 的取值范围可限定在 内(覆盖所有可能的解:、、)。
- 枚举 从 到 ,每次将 三个数存入数组
a[1..3],排序后检查a[2] - a[1] == a[3] - a[2]是否成立。 - 满足条件则答案
ans加一。
-
边界与细节:
- 当 时,三个可能的解 、、 均等于 ,因此只有 个解(样例 3)。
- 当 为奇数时, 不是整数,解的数量为 (样例 2)。
- 枚举范围 到 足够覆盖 的所有情况,不会遗漏。
⏱️ 复杂度分析
- 时间复杂度:,其中 为枚举范围, 来自对 3 个元素的排序(常数级别)。实际可以视为 。
- 空间复杂度:,仅使用常数个变量。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int main () { int c, b, ans = 0, a[5] = {}; scanf("%d%d", &a[1], &a[2]); c = a[1], b = a[2]; // 保存原始 A, B 值 for (int i = -200; i <= 200; i++) { a[3] = i; // 枚举 x a[1] = c, a[2] = b; // 恢复 A, B(因为上一轮排序打乱了顺序) sort(a + 1, a + 4); // 对三个数排序 if (a[2] - a[1] == a[3] - a[2]) ans++; // 检查是否构成等差数列 } printf("%d", ans); return 0; } -
- 1
信息
- ID
- 819
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者