全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:最多几个直角三角形
知识点递归深搜
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
有N条线段,长度分别为a[1]-a[N]。现要求你计算这N条线段最多可以组合成几个直角三角形,每条线段只能使用一次,每个三角形包含三条线段。
输入描述:
第一行输入一个正整数T(1 <= T <= 100),表示有T组测试数据。
对于每组测试数据,接下来有T行,每行第一个正整数N,表示线段个数,(3<=N<20),接着是N个正整数,表示每条线段长度,(0<a[i]<100)。
输出描述:
对于每组测试数据输出一行,每行包括一个整数,表示最多能组合的直角三角形个数。
示例1
输入:
1
7 3 4 5 6 5 12 13
输出:
2
说明:
可以组成2个直角三角形(3,4,5)、(5,12,13)
示例2
输入:
1
7 3 4 5 6 6 12 13
输出:
1
说明:
可以组成1个直角三角形(3,4,5)或(5,12,13),5只能使用一次,所以只有1个。
解题思路:
使用递归求出所有可能的情况,找出其中的最大值!
代码实现:Java代码满分实现
package com.codernav.demo.hwod.exam; import java.util.Arrays; import java.util.Scanner; /** * @title 最多几个直角三角形 * @Description 有N条线段,长度分别为a[1]-a[N]。现要求你计算这N条线段最多可以组合成几个直角三角形,每条线段只能使用一次,每个三角形包含三条线段。 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/28 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for (int index = 0; index < T; index++) { int N = sc.nextInt(); int[] lines = new int[N]; for (int i = 0; i < lines.length; i++) { lines[i] = sc.nextInt(); } Arrays.sort(lines); int max = cal(lines, 0); System.out.println(max); } } /** * 遍历出所有可能的情况 * * @param lines 线段数组 * @param initIndex 线段索引 * @return */ public static int cal(int[] lines, int initIndex) { int maxVal = 0; int a, b, c; for (int i = initIndex; i < lines.length - 2; i++) { a = lines[i]; if (a == 0) { continue; } for (int j = i + 1; j < lines.length - 1; j++) { b = lines[j]; if (b == 0) { continue; } for (int k = j + 1; k < lines.length; k++) { c = lines[k]; if (c == 0) { continue; } if ((a * a + b * b) == c * c) { lines[i] = 0; lines[j] = 0; lines[k] = 0; maxVal = Math.max(maxVal, cal(lines, i + 1) + 1); lines[i] = a; lines[j] = b; lines[k] = c; } } } } return maxVal; } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...