BGN75 构造三角形
思路
题目给了四个正整数 ,要我们从三个区间
、
、
各取一个数
,使得它们能构成一个非退化三角形。
三角形的核心条件就是任意两边之和大于第三边。由于 (因为区间本身就是递增的),最紧的约束一定是
。
那怎么让 最容易满足呢?很自然的想法:让
和
尽量大,
尽量小。
最大取
最大取
最小取
所以直接取 。
验证一下三角形条件:
,因为
,所以
恒成立 ✓
✓
✓(同第一条)
三个条件全部满足,而且不需要任何特判。题目保证有解,我们的构造也确实总是合法的,完美!
构造题就是这样,找到一个巧妙的取值方式,比暴力枚举优雅多了。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
long long a,b,c,d;
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
printf("%lld %lld %lld\n",b,c,c);
}
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();
StringBuilder sb = new StringBuilder();
while (t-- > 0) {
long a = sc.nextLong(), b = sc.nextLong(), c = sc.nextLong(), d = sc.nextLong();
sb.append(b).append(' ').append(c).append(' ').append(c).append('\n');
}
System.out.print(sb);
}
}
import sys
input = sys.stdin.readline
t = int(input())
out = []
for _ in range(t):
a, b, c, d = map(int, input().split())
out.append(f"{b} {c} {c}")
print('\n'.join(out))
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
const lines = [];
rl.on('line', (line) => lines.push(line.trim()));
rl.on('close', () => {
const t = parseInt(lines[0]);
const out = [];
for (let i = 1; i <= t; i++) {
const [a, b, c, d] = lines[i].split(' ').map(Number);
out.push(`${b} ${c} ${c}`);
}
console.log(out.join('\n'));
});
复杂度
- 时间复杂度:
,每组测试用例
。
- 空间复杂度:
。



京公网安备 11010502036488号