三角形(复杂度:O(n3))

题目

有n根棍子,棍子i的长度为ai。想要从中选出3根棍子组成周长尽可能长的三角形。请输出最大的周长,若无法组成三角形则输出0。

限制条件
  • 3≤n≤1000
  • 1≤ai≤106
样例

输入

 n = 5
 a = {2,3,4,5,10}

输出

12(选择3,4,5时)

输入

 n = 4
 a = {4,5,10,20}

输出

0(无论怎么选都无法组成三角形)

选择3根棍子,它们能组成三角形的充要条件为最长棍子的长度<其余两根棍子的长度之和。首先用三重循环枚举所有的棍子选择方案,再利用上式判断能否组成三角形。如果可以,那么该三角形的周长就是答案

//输入
int n, a[MAX_N];
void solve(){
   
   
in
package net.mooctest; /** * 三角形类,用于判断三角形是否合法及确定三角形类型 */ public class Triangle { // 三角形第一条边的长度 protected long lborderA = 0; // 三角形第二条边的长度 protected long lborderB = 0; // 三角形第三条边的长度 protected long lborderC = 0; /** * 构造方法,初始化三角形的三条边 * @param lborderA 第一条边的长度 * @param lborderB 第二条边的长度 * @param lborderC 第三条边的长度 */ public Triangle(long lborderA, long lborderB, long lborderC) { // 为当前对象的第一条边赋值 this.lborderA = lborderA; // 为当前对象的第二条边赋值 this.lborderB = lborderB; // 为当前对象的第三条边赋值 this.lborderC = lborderC; } /** * 判断指定的三角形是否为合法三角形 * @param triangle 待判断的三角形对象 * @return 若为合法三角形返回true,否则返回false */ public boolean isTriangle(Triangle triangle) { // 初始化判断结果为false(默认不是三角形) boolean isTriangle = false; // 检查三角形三条边是否在有效范围内(大于0且不超过long类型的最大值) if ((triangle.lborderA > 0 && triangle.lborderA <= Long.MAX_VALUE) && (triangle.lborderB > 0 && triangle.lborderB <= Long.MAX_VALUE) && (triangle.lborderC > 0 && triangle.lborderC <= Long.MAX_VALUE)) { // 检查三角形任意两边之差是否小于第三边(三角形判定的等价条件) if (diffOfBorders(triangle.lborderA, triangle.lborderB) < triangle.lborderC && diffOfBorders(triangle.lborderB, triangle.lborderC) < triangle.lborderA && diffOfBorders(triangle.lborderC, triangle.lborderA) < triangle.lborderB) { // 满足条件,设置为合法三角形 isTriangle = true; } } // 返回判断结果 return isTriangle; } /** * 判断三角形的类型 * @param triangle 待判断类型的三角形对象 * @return 三角形类型,可能值为: * "Illegal"(非法三角形)、 * "Regular"(等边三角形)、 * "Scalene"(不等边三角形)、 * "Isosceles"(等腰三角形) */ public String getType(Triangle triangle) { // 默认为非法三角形 String strType = "Illegal"; // 先判断是否为合法三角形 if (isTriangle(triangle)) { // 判断是否为等边三角形(三条边都相等) if (triangle.lborderA == triangle.lborderB && triangle.lborderB == triangle.lborderC) { strType = "Regular"; } // 判断是否为不等边三角形(三条边都不相等) else if ((triangle.lborderA != triangle.lborderB) && (triangle.lborderB != triangle.lborderC) && (triangle.lborderA != triangle.lborderC)) { strType = "Scalene"; } // 其余情况为等腰三角形(至少两条边相等) else { strType = "Isosceles"; } } // 返回三角形类型 return strType; } /** * 计算两条边长度的差值(取绝对值) * @param a 第一条边的长度 * @param b 第二条边的长度 * @return 两条边长度差值的绝对值 */ public long diffOfBorders(long a, long b) { // 若a大于b则返回a-b,否则返回b-a(实现绝对值效果) return (a > b) ? (a - b) : (b - a); } /** * 获取当前三角形对象的三条边长度 * @return 包含三条边长度的long数组,索引0为lborderA,1为lborderB,2为lborderC */ public long[] getBorders() { // 创建长度3的数组用于存储三条边 long[] borders = new long[3]; // 存储第一条边 borders[0] = this.lborderA; // 存储第二条边 borders[1] = this.lborderB; // 存储第三条边 borders[2] = this.lborderC; // 返回存储三条边的数组 return borders; } public static void main(String[] args) { // 测试1:等边三角形(5,5,5) Triangle equilateral = new Triangle(5, 5, 5); System.out.println("三边为5,5,5的三角形类型:" + equilateral.getType(equilateral)); // 测试2:等腰三角形(5,5,8) Triangle isosceles = new Triangle(5, 5, 8); System.out.println("三边为5,5,8的三角形类型:" + isosceles.getType(isosceles)); // 测试3:普通三角形3,4,5) Triangle scalene = new Triangle(3, 4, 5); System.out.println("三边为3,4,5的三角形类型:" + scalene.getType(scalene)); // 测试4:非法三角形1,2,3) Triangle illegal = new Triangle(1, 2, 3); System.out.println("三边为1,2,3三角形类型:" + illegal.getType(illegal)); // 测试5:含负数的非法三角形(-1, 5, 5) Triangle negative = new Triangle(-1, 5, 5); System.out.println("三边为-1,5,5的三角形类型:" + negative.getType(negative)); } } 请画出以上代码的动态测试基本路径法控制流图
最新发布
10-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【执珪】瑕瑜·夕环玦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值