判断一组不等式是否满足约束并输出最大差

题目描述:
判断一组不等式是否满足约束并输出最大差

给定一组不等式,判断是否成立并输出不等式的最大差(输出浮点数的整数部分), 要求:

1)不等式系数为double类型,是一个二维数组;

2)不等式的变量为int类型,是一维数组;

3)不等式的目标值为double类型,是一维数组;

4)不等式约束为字符串数组,只能是:“>”,“>=”,“<”,“<=”,“=”,例如,不等式组:
原文链接

a11*x1+a12*x2+a13*x3+a14*x4+a15*x5<=b1;
 
a21*x1+a22*x2+a23*x3+a24*x4+a25*x5<=b2;
 
a31*x1+a32*x2+a33*x3+a34*x4+a35*x5<=b3;

最大差=max
{  (a11*x1+a12*x2+a13*x3+a14*x4+a15*x5-b1),  
 
(a21*x1+a22*x2+a23*x3+a24*x4+a25*x5-b2), 
 
(a31*x1+a32*x2+a33*x3+a34*x4+a35*x5-b3)  },
类型为整数(输出浮点数的整数部分)

输入描述
1)不等式组系数(double类型):

a11,a12,a13,a14,a15 
a21,a22,a23,a24,a25
a31,a32,a33,a34,a35

2)不等式变量(int类型):

x1,x2,x3,x4,x5

3)不等式目标值(double类型):

b1,b2,b3

4)不等式约束(字符串类型):

<=,<=,<=
a11,a12,a13,a14,a15;a21,a22,a23,a24,a25;a31,a32,a33,a34,a35;x1,x2,x3,x4,x5;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   ×   1   +   3   ×   3   +   5.6   ×   2   +   7   ×   7   +   6   ×   5   -   340 = -238.5
// 11   ×   1   +   3   ×   3   +   8.6   ×   2   +   25   ×   7   +   5   ×   1   -   670 = -452.8
// 0.3   ×   1   +   9   ×   3   +   5.3   ×   2   +   66   ×   7   +   7.8   ×   5   -   80.6 = 458.3

前两个不满足条件,所以输出为false。
然后计算三个差值中的最大值,取整数部分。

public static void main(String[] args) {
				//将字符串转化为数字
		        Scanner in = new Scanner(System.in);
		        String[] str = in.nextLine().split(";");
		        in.close();
		        int num_eq = str[str.length - 1].split(",").length;  // 3,等式的数量(<=,<=,<=),二维数组中一维数组的个数
		        int num_x = str[0].split(",").length;  //5,每个一维数组元素的数量
		        double[][] a= new double[num_eq][num_x];
		        int[] x = new int[num_x];
		        double[] b = new double[num_eq];
		        String[] eq = new String[num_eq];
		        int[] res = new int[num_eq];
		        int max = 0;
		        boolean flag = true;
		        // 分别处理a,x,b,符号
		        for (int i = 0; i < num_eq; i++) {  // 处理a
		            String[] tmp1 = str[i].split(",");
		            for (int j = 0; j < tmp1.length; j++) {
		                a[i][j] = Double.valueOf(tmp1[j]);
		            }
		        }
		        String[] tmp2 = str[num_eq].split(",");
		        for (int i = 0; i < tmp2.length; i++) {  // 处理x
		            x[i] = Integer.parseInt(tmp2[i]);
		        }
		        String[] tmp3 = str[num_eq + 1].split(",");
		        for (int i = 0; i < tmp3.length; i++) {  // 处理b
		            b[i] = Double.valueOf(tmp3[i]);
		        }
		        String[] tmp4 = str[num_eq + 2].split(",");
		        for (int i = 0; i < tmp4.length; i++) {  // 处理符号
		            eq[i] = tmp4[i];
		        }
		        for (int i = 0; i < num_eq; i++) {
		            double tmp = 0.0;
		            for (int j = 0; j < num_x; j++) {
		                tmp += a[i][j] * x[j];
		            }
		            if ("<=".equals(eq[i])) {
		                flag = tmp <= b[i] ? flag && true : flag && false;
		            } else if ("<".equals(eq[i])) {
		                flag = tmp < b[i] ? flag && true : flag && false;
		            }else if ("=".equals(eq[i])) {
		                flag = tmp == b[i] ? flag && true : flag && false;
		            }else if (">=".equals(eq[i])) {
		                flag = tmp >= b[i] ? flag && true : flag && false;
		            }else if (">".equals(eq[i])) {
		                flag = tmp > b[i] ? flag && true : flag && false;
		            }
		            res[i] =(int) ((tmp - b[i]) / 1);
		        }
		        for (int i = 0; i < num_eq; i++) {
		            max = Math.max(max, res[i]);
		        }
		        System.out.println(flag + " " + max);
		    }
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值