1 条题解

  • 0
    @ 2026-6-19 10:30:58

    📝 题目大意

    给定两个整数 AABB,求有多少个整数 xx,使得 A,B,xA, B, x 三个数可以排列成一个等差数列(即存在一种排列 p,q,rp, q, r 满足 qp=rqq-p = r-q)。

    💡 解题思路

    1. 题目分析A,BA, B 的范围仅 [1,100][1, 100],数据量极小。三个数能构成等差数列的充要条件是:排序后,中间数等于两边数的平均值,即相邻两数之差相等。

    2. 算法推导

      • 由于 A,B[1,100]A, B \in [1, 100]xx 的取值范围可限定在 [200,200][-200, 200] 内(覆盖所有可能的解:2AB2A-BA+B2\frac{A+B}{2}2BA2B-A)。
      • 枚举 xx200-200200200,每次将 A,B,xA, B, x 三个数存入数组 a[1..3],排序后检查 a[2] - a[1] == a[3] - a[2] 是否成立。
      • 满足条件则答案 ans 加一。
    3. 边界与细节

      • A=BA = B 时,三个可能的解 2AB2A-BA+B2\frac{A+B}{2}2BA2B-A 均等于 AA,因此只有 11 个解(样例 3)。
      • A+BA+B 为奇数时,A+B2\frac{A+B}{2} 不是整数,解的数量为 22(样例 2)。
      • 枚举范围 200-200200200 足够覆盖 A,B[1,100]A, B \in [1, 100] 的所有情况,不会遗漏。

    ⏱️ 复杂度分析

    • 时间复杂度O(KlogK)O(K \log K),其中 K=401K = 401 为枚举范围,logK\log K 来自对 3 个元素的排序(常数级别)。实际可以视为 O(1)O(1)
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (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
    上传者