华为OD E卷(100分)47-不等式是否满足约束并输出最大差
前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
给定一组不等式,判断是否成立并输出不等式的最大差(输出浮点数的整数部分)
要求:
-
不等式系数为 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
输入
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
题解
Java实现
package huawei.e100;
import java.util.ArrayList;
import java.util.Scanner;
/**
* @author arnold
* @date 2025年1月3日
* 判断一组不等式是否满足约束并输出最大差
*/
public class T47 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String[] tmp = sc.nextLine().split(";");
int arrayNum = tmp.length -3;
ArrayList<Double[]> al = new ArrayList<Double[]>();
for (int i = 0; i < arrayNum; i++) {
String[] as = tmp[i].split(",");
Double[] a = new Double[as.length];
for (int j = 0; j < a.length; j++) {
a[j] = Double.parseDouble(as[j]);
}
al.add(a);
}
String[] bs = tmp[tmp.length -3].split(",");
Double[] b = new Double[bs.length];
for (int j = 0; j < bs.length; j++) {
b[j] = Double.parseDouble(bs[j]);
}
String[] ts = tmp[tmp.length -2].split(",");
Double[] t = new Double[ts.length];
for (int j = 0; j < ts.length; j++) {
t[j] = Double.parseDouble(ts[j]);
}
String[] op = tmp[tmp.length -1].split(",");
boolean res = check1(al, b, op, t);
int res2 = check2(al, b, t);
System.out.print(res + " ");
System.out.print(res2 );
System.out.println();
}
}
static boolean check1(ArrayList<Double[]> al, Double[] b, String[] op, Double[] t){
boolean res = true;
for (int i = 0; i < al.size(); i++) {
Double[] a = al.get(i);
Double sum = 0.0;
for (int j = 0; j < a.length; j++) {
sum += a[j]*b[j];
}
if(op[i].equals(">")) {
if (sum > t[i] != true) return false;
} else if(op[i].equals(">=")) {
if (sum >= t[i] != true) return false;
} else if(op[i].equals("=")) {
if (sum == t[i] != true) return false;
} else if(op[i].equals("<=")) {
if (sum <= t[i] != true) return false;
} else if(op[i].equals("<")) {
if (sum < t[i] != true) return false;
}
}
return res;
}
static int check2(ArrayList<Double[]> al, Double[] b, Double[] t){
int max = Integer.MIN_VALUE;
for (int i = 0; i < al.size(); i++) {
Double[] a = al.get(i);
Double sum = 0.0;
for (int j = 0; j < a.length; j++) {
sum += a[j]*b[j];
}
max = (int)Math.max(sum-t[i], max);
}
return max;
}
}