当前位置: 首页 > news >正文

华为OD机试_2025 B卷_判断一组不等式是否满足约束并输出最大差(Python,100分)(附详细解题思路)

题目描述

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

  1. 不等式系数为 double类型,是一个二维数组
  2. 不等式的变量为 int类型,是一维数组;
  3. 不等式的目标值为 double类型,是一维数组
  4. 不等式约束为字符串数组,只能是:“>”,“>=”,“<”,“<=”,“=”,
    例如,不等式组:
    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,<=,<=,<=
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)不等式约束(字符串类型):<=,<=,<=

输出描述
true或者 false,最大差

用例

输入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.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
说明

不等式组验证与最大差计算算法详解

核心解题思路

本题目要求验证给定的不等式组是否成立,并计算不等式组的最大差值。核心解题思路可分为三个步骤:

关键步骤

  1. 数据解析:将输入字符串解析为系数矩阵、变量数组、目标值和约束条件
  2. 不等式验证:计算每个不等式的左边值,验证是否满足约束条件
  3. 最大差计算:计算所有不等式左边值与目标值的差值,找出最大值

核心算法

  • 点积计算:使用系数矩阵的行与变量数组计算每个不等式的左边值
  • 约束验证:根据约束符号(>, >=, <, <=, =)验证不等式
  • 差值分析:计算每个不等式的差值(左边值 - 目标值),找出最大值

完整代码实现

def main():# 读取输入data = input().strip()# 分割输入字符串parts = data.split(';')k = len(parts) - 3  # 不等式个数# 解析系数矩阵coeffs = []for i in range(k):row = [float(x) for x in parts[i].split(',')]coeffs.append(row)# 解析变量数组variables = [int(x) for x in parts[k].split(',')]# 解析目标值targets = [float(x) for x in parts[k+1].split(',')]# 解析约束条件constraints = [x.strip() for x in parts[k+2].split(',')]# 初始化结果all_valid = Truemax_diff = -10**18  # 初始化为极小值# 处理每个不等式for i in range(k):# 计算左边值 (系数与变量的点积)left_value = 0.0for j in range(len(variables)):left_value += coeffs[i][j] * variables[j]# 计算差值diff = left_value - targets[i]# 更新最大差值if diff > max_diff:max_diff = diff# 验证约束条件constraint = constraints[i]if constraint == '<=':if left_value > targets[i]:all_valid = Falseelif constraint == '<':if left_value >= targets[i]:all_valid = Falseelif constraint == '>=':if left_value < targets[i]:all_valid = Falseelif constraint == '>':if left_value <= targets[i]:all_valid = Falseelif constraint == '=':if abs(left_value - targets[i]) > 1e-10:  # 考虑浮点数精度all_valid = False# 输出结果result = "true" if all_valid else "false"print(f"{result} {int(max_diff)}")if __name__ == "__main__":main()

算法原理解析

1. 数据解析模块

parts = data.split(';')
k = len(parts) - 3
  • 输入格式:输入字符串分为四部分(系数矩阵、变量、目标值、约束)
  • 系数矩阵:前k部分为不等式系数,每行逗号分隔
  • 变量数组:第k部分为整型变量
  • 目标值:第k+1部分为双精度目标值
  • 约束条件:第k+2部分为字符串约束

2. 点积计算

left_value = 0.0
for j in range(len(variables)):left_value += coeffs[i][j] * variables[j]
  • 数学表示 l e f t _ v a l u e = ∑ j = 0 n − 1 c o e f f [ i ] [ j ] × v a r i a b l e s [ j ] left\_value = \sum_{j=0}^{n-1} coeff[i][j] \times variables[j] left_value=j=0n1coeff[i][j]×variables[j]
  • 时间复杂度:O(k×n),k为不等式数,n为变量数

3. 约束验证

if constraint == '<=':if left_value > targets[i]:all_valid = False
elif constraint == '<':# ...其他约束类似
  • 约束类型:支持5种比较操作符
  • 浮点精度处理:对等号约束使用容差1e-10

4. 最大差计算

diff = left_value - targets[i]
if diff > max_diff:max_diff = diff
  • 差值定义:左边值 - 目标值
  • 整数转换:使用int()获取整数部分(截断小数)

示例解析

示例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;<=,<=,<=

  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]
    • 约束:['<=', '<=', '<=']
  2. 不等式计算

    • 不等式1:2.3*1 + 3*3 + 5.6*2 + 7*7 + 6*5 = 101.5 → 101.5 <= 340 (成立)
    • 不等式2:11*1 + 3*3 + 8.6*2 + 25*7 + 1*5 = 217.2 → 217.2 <= 670 (成立)
    • 不等式3:0.3*1 + 9*3 + 5.3*2 + 66*7 + 7.8*5 = 538.9 → 538.9 <= 80.6 (不成立)
  3. 最大差计算

    • 差值:101.5-340 = -238.5, 217.2-670 = -452.8, 538.9-80.6 = 458.3
    • 最大值:458.3 → 整数部分458
  4. 输出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;<=,>=,<=

  1. 数据解析

    • 系数矩阵:
      [ [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]
    • 约束:['<=', '>=', '<=']
  2. 不等式计算

    • 不等式1:2.36*1 + 3*13 + 6*2 + 7.1*17 + 6*5 = 204.06 → 204.06 <= 340 (成立)
    • 不等式2:1*1 + 30*13 + 8.6*2 + 2.5*17 + 21*5 = 555.7 → 555.7 >= 67 (成立)
    • 不等式3:0.3*1 + 69*13 + 5.3*2 + 6.6*17 + 7.8*5 = 1059.1 → 1059.1 <= 300.6 (不成立)
  3. 最大差计算

    • 差值:204.06-340 = -135.94, 555.7-67=488.7, 1059.1-300.6=758.5
    • 最大值:758.5 → 整数部分758
  4. 输出false 758

边界情况测试

测试1:所有不等式成立

输入: "1,1;2,2;1,1;3;=,="
解析: 系数: [[1,1], [2,2]]变量: [1,1]目标值: [3, 3]约束: ["=", "="]
计算:不等式1: 1*1+1*1=23 → 不成立不等式2: 2*1+2*1=43 → 不成立
输出: false 1 (4-3=1)

测试2:浮点数精度问题

输入: "0.1,0.2;0.1,0.2;1,1;0.3;="
解析:系数: [[0.1,0.2]]变量: [1,1]目标值: [0.3]约束: ["="]
计算:左边值: 0.1*1+0.2*1=0.3浮点精度处理: abs(0.3-0.3)<1e-10 → 成立
输出: true 0

测试3:负差值

输入: "2,3;1,1;5,5;10;<"
解析:系数: [[2,3]]变量: [1,1]目标值: [10]约束: ["<"]
计算:左边值: 2*1+3*1=5 < 10 → 成立差值: 5-10=-5
输出: true -5

总结与扩展

关键知识点

  1. 字符串处理:复杂输入格式的解析技巧
  2. 矩阵运算:点积计算的核心算法
  3. 约束验证:多种比较操作的统一处理
  4. 浮点精度:等值比较的容差处理

实际应用场景

  1. 数学建模:验证复杂不等式组的可行性
  2. 金融分析:评估投资组合约束条件
  3. 工程优化:验证设计参数是否满足约束
  4. 质量控制:检查产品参数是否符合标准

扩展思考

核心启示:通过系统化的输入解析、精确的数学计算和全面的约束验证,本算法高效解决了不等式组的验证和差值计算问题。清晰的模块划分和边界处理保证了算法的健壮性。

初学者可从中学习:

  1. 复杂输入数据的解析方法
  2. 矩阵与向量运算的实现
  3. 多种约束条件的统一处理
  4. 浮点数比较的精度控制
  5. 算法结果的综合分析与输出

相关文章:

  • 网站并发访问量达到1万以上需要注意哪些事项
  • 【DCS开源项目】—— Lua 如何调用 DLL、DLL 与 DCS World 的交互
  • 最具有实际意义价值的比赛项目
  • 数据结构——函数填空题
  • 力扣网C语言编程题:多数元素
  • 【Linux仓库】进程概念与基本操作【进程·贰】
  • Python编程语言:2025年AI浪潮下的技术统治与学习红利
  • Laravel 项目中图片上传后无法访问的问题
  • RabbitMQ 的工作流程
  • Android NDK下载链接及配置版本
  • 微服务架构的适用
  • 深入浅出JavaScript 中的代理模式:用 Proxy 掌控对象的“行为开关”
  • CTF--PhP Web解题(走入CTF)
  • [C++] STL数据结构小结
  • access和excel用vba进行辅助办公软件开发
  • c++26新功能—hive容器
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 03(题目+回答)
  • WebeServer实现:学到了哪些东西
  • STM32F103_LL库+寄存器学习笔记12.3 - 串口DMA高效收发实战3:支持多实例化的版本
  • 如何在MacOS系统和Windows系统安装节点小宝远程工具
  • 小网站怎么赚钱/企业营销策划方案
  • asp.net小型网站开发/网站建设推广服务
  • 网站建设好么/搜索引擎营销推广方案
  • 做pc网站/单词优化和整站优化
  • 做卖挖掘机的网站/网站提交工具
  • 动态网站和静态网站的区别和联系/网络软文范文