题目链接

构造C的歪

题目描述

小歪有两个整数 ,他想找到这样一个整数 ,使得这三个整数在经过排序后能成为一个等差数列。

解题思路

一个等差数列是指一组按顺序排列的数字,其中任意两个连续项之间的差都相等。这个差被称为公差。

假设我们已经有了两个数 ,我们需要找到第三个数 ,使得这三个数排序后能构成等差数列。设排序后的三个数为 ,那么它们必须满足

我们可以分情况讨论 在这个有序数列中的位置:

  1. 是数列的相邻两项

    • 不妨假设
    • 情况一 是前两项。那么数列是 。公差为 。第三项 就应该是
    • 情况二 是后两项。那么数列是 。公差同样为 。第一项 就应该是
  2. 是数列的两端项

    • 同样假设 。数列是
    • 此时, 必须是 的算术平均值,即
    • 这个解只有在 是偶数时才存在(即 的奇偶性相同),因为 必须是整数。

选择一个简单的通用解 题目要求我们给出任意一个可行的解即可。最简单、并且永远有整数解的方法,就是将 作为相邻项来构造第三个数。

我们可以先找出 中的较大值和较小值,然后计算出它们的差作为公差,再用较大值加上公差得到第三个数。

具体步骤:

  1. 找出 的最大值 和最小值
  2. 计算公差
  3. 计算第三个数

这个 一定能和 构成一个等差数列

例如,输入为 3 和 2:

  • ,
  • 公差
  • 第三个数
  • 最终的三个数是 ,它们构成了一个等差数列。所以输出 是一个正确的答案。

代码

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    // 找出较大值,加上两者的差值
    int c = max(a, b) + abs(a - b);
    cout << c << endl;
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        // 找出较大值,加上两者的差值
        int c = Math.max(a, b) + Math.abs(a - b);
        System.out.println(c);
    }
}
a, b = map(int, input().split())
# 找出较大值,加上两者的差值
c = max(a, b) + abs(a - b)
print(c)

算法及复杂度

  • 算法:数学计算
  • 时间复杂度:,只需要进行几次简单的算术运算。
  • 空间复杂度:,只需要常数级别的额外空间。