华为OD机试题库《C++》限时优惠 9.9
华为OD机试题库《Python》限时优惠 9.9
华为OD机试题库《JavaScript》限时优惠 9.9
针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。
看不懂有疑问需要答疑辅导欢迎私VX: code5bug
题目描述
给定一组不等式,判断是否成立并输出不等式的最大差(输出浮点数的整数部分)
要求:
- 不等式系数为 double类型,是一个二维数组
- 不等式的变量为 int类型,是一维数组;
- 不等式的目标值为 double类型,是一维数组
- 不等式约束为字符串数组,只能是:“>”,“>=”,“<”,“<=”,“=”,
例如,不等式组:
a11x1 + a12x2 + a13x3 + a14x4 + a15x5 <= b1;
a21x1 + a22x2 + a23x3 + a24x4 + a25x5 <= b2;
a31x1 + a32x2 + a33x3 + a34x4 + a35x5 <= b3;
最大差 = max{(a11x1+a12x2+a13x3+a14x4+a15x5-b1),(a21x1+a22x2+a23x3+a24x4+ a25x5-b2),(a31x1+a32x2+a33x3+a34x4+a35x5-b3)},
类型为整数(输出浮点数的整数部分)
输入描述
a11,a12,a13,a14,a15,a21,a22,a23,a24,a25, a31,a32,a33,a34,a35,x1,x2,x3,x4,x5,b1,b2,b3,<=,<=,<=
-
不等式组系数(double类型):
a11,a12,a13,a14,a15
a21,a22,a23,a24,a25
a31,a32,a33,a34,a35
-
不等式变量(int类型):x1,x2,x3,x4,x5
-
不等式目标值(double类型):b1,b2,b3
-
不等式约束(字符串类型):<=,<=,<=
输出描述
true或者 false,最大差
示例1
输入:
2,3,3,5.6,7.6;11,3,8.6,25,1;0.3,9,5.3,66,7.8;1,3,2,7,5;340,670,80.6;<=,<=,<=
输出:
false 458
说明:
不等式系数:
- 第一行:2, 3, 3, 5.6, 7.6
- 第二行:11, 3, 8.6, 25, 1
- 第三行:0.3, 9, 5.3, 66, 7.8
变量:x1=1, x2=3, x3=2, x4=7, x5=5
目标值:b1=340, b2=670, b3=80.6
不等式关系:<=, <=, <=
对应的三个不等式为:
2.3 x 1 + 3 x 2 + 5.6 x 3 + 7.6 x 4 + 11 x 5 ≤ 340
11 x 1 + 3 x 2 + 8.6 x 3 + 25 x 4 + 1 x 5 ≤ 670
0.3 x 1 + 9 x 2 + 5.3 x 3 + 66 x 4 + 7.8 x 5 ≤ 80.6 不成立
计算每个不等式的左侧表达式,判断是否成立,并计算差值:
第一个不等式的左侧值大于340,不成立。
计算差值,并输出最大差值的整数部分(458)。
最后输出 false 和最大差值 458。
示例2
输入:
2.36,3,6,7.1,6;1,30,8.6,2.5,21;0.3,69,5.3,6.6,7.8;1,13,2,17,5;340,67,300.6;<=,>=,<=
输出:
false 758
题解
这道题目属于线性代数与条件判断的结合题型,主要考察对线性不等式的计算和条件判断能力。题目要求我们根据给定的不等式组、变量、目标值和约束条件,判断所有不等式是否成立,并计算最大差值。
解题思路
- 解析输入数据:将输入字符串按分号(
;
)分割成不同部分,分别解析为不等式系数矩阵、变量数组、目标值数组和约束条件数组。- 计算差值:对于每一个不等式,计算其左侧表达式与右侧目标值的差值(即
a11*x1 + a12*x2 + ... + a1n*xn - b1
)。- 判断不等式是否成立:根据约束条件(如
<=
,>=
,<
,>
,=
),判断每个差值是否满足对应的约束。- 计算最大差值:在所有差值中找出最大值,并取其整数部分作为输出。
- 输出结果:如果所有不等式都满足约束,输出
true
和最大差值;否则输出false
和最大差值。
Java
import java.util.*;
import java.util.function.Function;
/**
* @author code5bug
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
String[] parts = input.split(";");
// 解析不等式系数矩阵
double[][] a = new double[3][5];
for (int i = 0; i < 3; i++) {
a[i] = Arrays.stream(parts[i].split(",")).mapToDouble(Double::parseDouble).toArray();
}
// 解析变量数组
int[] x = Arrays.stream(parts[3].split(",")).mapToInt(Integer::parseInt).toArray();
// 解析目标值数组
double[] b = Arrays.stream(parts[4].split(",")).mapToDouble(Double::parseDouble).toArray();
// 解析约束条件
String[] cmpOps = parts[5].split(",");
Map<String, Function<Double, Boolean>> funcs = new HashMap<>();
funcs.put(">", diff -> diff > 0);
funcs.put(">=", diff -> diff >= 0);
funcs.put("<", diff -> diff < 0);
funcs.put("<=", diff -> diff <= 0);
funcs.put("=", diff -> Math.abs(diff) < 1e-9);
// 计算每个不等式的差值
double[] differences = new double[3];
for (int i = 0; i < 3; i++) {
double sum = 0;
for (int j = 0; j < 5; j++) {
sum += a[i][j] * x[j];
}
differences[i] = sum - b[i];
}
// 检查所有不等式是否满足约束条件
boolean allSatisfied = true;
for (int i = 0; i < 3; i++) {
allSatisfied = allSatisfied && funcs.get(cmpOps[i]).apply(differences[i]);
}
// 计算最大差值并取整数部分
int maxDifference = (int)Arrays.stream(differences).max().getAsDouble();
// 输出结果
System.out.println((allSatisfied ? "true" : "false") + " " + maxDifference);
}
}
希望这个专栏能让您熟练掌握算法, 🎁🎁🎁。
整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏