题目链接
题目描述
给定四个正整数 ,满足
。需要构造三个整数
,使得:
可以构成一个非退化三角形。
题目保证至少存在一组解,输出任意一组即可。
解题思路
要使三条边 构成三角形,它们必须满足三角形不等式:
我们来分析这三个条件。根据题目给定的取值范围:,
,
。
-
对于条件
: 我们知道
的最小值为
,
的最小值为
,
的最大值为
。 因此,
。 因为
是正整数(
),所以
。 结合起来有
。 所以
这个条件总是成立的。
-
对于条件
: 类似地,
的最小值为
,
的最小值为
,
的最大值为
。 因此,
。 因为
是正整数(
),所以
。 结合起来有
。 所以
这个条件也总是成立的。
-
对于条件
: 这个条件不是必然成立的,需要我们通过构造来满足。 为了更容易满足
,一个自然的想法是让
和
尽可能大,让
尽可能小。
让我们尝试一种最简单的构造方法:
- 在
的范围
中,取最大值
。
- 在
的范围
中,取最大值
。
- 在
的范围
中,取最小值
。
现在我们来验证这组构造
是否满足所有条件:
(成立,因为
)。
(成立,因为
)。
(成立,因为
)。
- 验证三角形不等式:
。因为
是正整数(
),此式成立。
。同样成立。
。因为
,所以
。由于
,
。因此
恒成立。
所有条件都满足。因此,
是一组必定满足条件的解。我们只需输出这三个数即可。
- 在
代码
#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()
算法及复杂度
- 算法:构造法。根据对三角形不等式和取值范围的分析,我们找到了一组简单的、必定符合条件的解
。
- 时间复杂度:对于每组测试数据,我们只需要进行一次读入和一次输出,操作是常数时间的。如果共有
组测试数据,则总时间复杂度为
。
- 空间复杂度:我们只需要存储几个变量,因此空间复杂度为
。