题目链接

构造三角形

题目描述

给定四个正整数 ,满足 。需要构造三个整数 ,使得:

  1. 可以构成一个非退化三角形。

题目保证至少存在一组解,输出任意一组即可。

解题思路

要使三条边 构成三角形,它们必须满足三角形不等式:

我们来分析这三个条件。根据题目给定的取值范围:, ,

  • 对于条件 : 我们知道 的最小值为 的最小值为 的最大值为 。 因此,。 因为 是正整数(),所以 。 结合起来有 。 所以 这个条件总是成立的。

  • 对于条件 : 类似地, 的最小值为 的最小值为 的最大值为 。 因此,。 因为 是正整数(),所以 。 结合起来有 。 所以 这个条件也总是成立的。

  • 对于条件 : 这个条件不是必然成立的,需要我们通过构造来满足。 为了更容易满足 ,一个自然的想法是让 尽可能大,让 尽可能小。

    让我们尝试一种最简单的构造方法:

    • 的范围 中,取最大值
    • 的范围 中,取最大值
    • 的范围 中,取最小值

    现在我们来验证这组构造 是否满足所有条件:

    1. (成立,因为 )。
    2. (成立,因为 )。
    3. (成立,因为 )。
    4. 验证三角形不等式:
      • 。因为 是正整数(),此式成立。
      • 。同样成立。
      • 。因为 ,所以 。由于 , 。因此 恒成立。

    所有条件都满足。因此, 是一组必定满足条件的解。我们只需输出这三个数即可。

代码

#include <iostream>

using namespace std;

void solve() {
    long long a, b, c, d;
    cin >> a >> b >> c >> d;
    cout << b << " " << c << " " << c << endl;
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t-- > 0) {
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            System.out.println(b + " " + c + " " + c);
        }
    }
}
def solve():
    a, b, c, d = map(int, input().split())
    print(b, c, c)

t = int(input())
for _ in range(t):
    solve()

算法及复杂度

  • 算法:构造法。根据对三角形不等式和取值范围的分析,我们找到了一组简单的、必定符合条件的解
  • 时间复杂度:对于每组测试数据,我们只需要进行一次读入和一次输出,操作是常数时间的。如果共有 组测试数据,则总时间复杂度为
  • 空间复杂度:我们只需要存储几个变量,因此空间复杂度为