#P3087. 判断一组不等式是否满足约束并输出最大差(100分)
-
1000ms
Tried: 86
Accepted: 40
Difficulty: 3
所属公司 :
华为od
判断一组不等式是否满足约束并输出最大差(100分)
题面解释:
给定一组不等式,输入包括不等式的系数(二维数组,double类型)、不等式的变量(int类型的一维数组)、不等式的目标值(double类型的一维数组)以及不等式的约束条件(字符串数组,包含“>”,“>=”,“<”,“<=”,“=”)。程序需要判断这些不等式是否成立,并输出不等式左边表达式与右边目标值之间的最大差(取整数部分)。输出格式为“true”或“false”,后跟最大差的整数部分。
思路:
模拟题,按照题目意思模拟计算过程即可.
题解
这个题目要求我们根据输入的一组不等式来判断不等式是否成立,并且计算不等式左右两边差值的最大值。我们可以分为以下几步来完成这个问题:
-
解析输入: 我们通过字符串的分割将输入按照
;和,分割成多个部分,分别提取出不等式的系数、变量、目标值和不等式的符号。 -
计算不等式的结果: 对于每一个不等式,我们计算其左边的表达式结果(系数乘以对应变量的值之和),然后减去右边的目标值,得到差值。
-
验证不等式是否成立: 我们根据输入的约束符号(如
<=,>=等),通过辅助函数check来判断每一个不等式是否成立。 -
计算最大差值: 我们取所有不等式计算结果中的最大值,输出该值的整数部分。
-
输出结果: 输出结果是判断不等式是否全部成立的布尔值,和最大差值的整数部分。
c++
#include <bits/stdc++.h>
using namespace std;
// 判断不等式是否成立的辅助函数
// c 是不等式左边减去右边的结果,type 是不等式的类型 (>, >=, <, <=, =)
bool check(double c, string type)
{
bool mk = 0; // 用于标识不等式是否成立
if(type == ">")
{
mk = c > 0;
}
else if(type == ">=")
{
mk = c >= 0;
}
else if(type == "<")
{
mk = c < 0;
}
else if(type == "<=")
{
mk = c <= 0;
}
else mk = c == 0; // 处理 "=" 的情况
return mk;
}
signed main()
{
string s;
cin >> s; // 输入整个字符串
stringstream ss(s); // 使用 stringstream 进行分割
vector<string> str;
string temp;
// 按照 ';' 分割输入字符串,分为不同部分
while(getline(ss, temp, ';'))
{
str.emplace_back(temp);
}
// 分别处理系数、不等式变量、目标值、不等式符号
vector<string> a1, a2, a3, x, b, op;
// 解析第1行的系数
stringstream ss1(str[0]);
while(getline(ss1, temp, ',')) a1.push_back(temp);
// 解析第2行的系数
stringstream ss2(str[1]);
while(getline(ss2, temp, ',')) a2.push_back(temp);
// 解析第3行的系数
stringstream ss3(str[2]);
while(getline(ss3, temp, ',')) a3.push_back(temp);
// 解析变量
stringstream ss4(str[3]);
while(getline(ss4, temp, ',')) x.push_back(temp);
// 解析目标值
stringstream ss5(str[4]);
while(getline(ss5, temp, ',')) b.push_back(temp);
// 解析不等式符号
stringstream ss6(str[5]);
while(getline(ss6, temp, ',')) op.push_back(temp);
// 计算三个不等式的差值
double res1 = stod(a1[0]) * stoi(x[0]) + stod(a1[1]) * stoi(x[1]) + stod(a1[2]) * stoi(x[2]) +
stod(a1[3]) * stoi(x[3]) + stod(a1[4]) * stoi(x[4]) - stod(b[0]);
double res2 = stod(a2[0]) * stoi(x[0]) + stod(a2[1]) * stoi(x[1]) + stod(a2[2]) * stoi(x[2]) +
stod(a2[3]) * stoi(x[3]) + stod(a2[4]) * stoi(x[4]) - stod(b[1]);
double res3 = stod(a3[0]) * stoi(x[0]) + stod(a3[1]) * stoi(x[1]) + stod(a3[2]) * stoi(x[2]) +
stod(a3[3]) * stoi(x[3]) + stod(a3[4]) * stoi(x[4]) - stod(b[2]);
// 判断三个不等式是否成立
bool f = (check(res1, op[0])) && (check(res2, op[1])) && (check(res3, op[2]));
// 计算最大差值
double ans = max({res1, res2, res3});
// 输出判断结果
if(f) cout << "true";
else cout << "false";
// 输出最大差值的整数部分
cout << " ";
cout << (int)ans << endl;
}
python
def check(c, op_type):
if op_type == ">":
return c > 0
elif op_type == ">=":
return c >= 0
elif op_type == "<":
return c < 0
elif op_type == "<=":
return c <= 0
else:
return c == 0
def main():
# 读取输入的字符串
s = input().strip()
# 将输入按';'分割
str_list = s.split(';')
# 分别处理不同部分的字符串
a1 = str_list[0].split(',')
a2 = str_list[1].split(',')
a3 = str_list[2].split(',')
x = str_list[3].split(',')
b = str_list[4].split(',')
op = str_list[5].split(',')
# 计算res1, res2, res3
res1 = sum([float(a1[i]) * int(x[i]) for i in range(5)]) - float(b[0])
res2 = sum([float(a2[i]) * int(x[i]) for i in range(5)]) - float(b[1])
res3 = sum([float(a3[i]) * int(x[i]) for i in range(5)]) - float(b[2])
# 检查是否满足所有条件
f = check(res1, op[0]) and check(res2, op[1]) and check(res3, op[2])
# 计算最大的res值
ans = max(res1, res2, res3)
# 输出结果
if f:
print("true", end=" ")
else:
print("false", end=" ")
print(int(ans))
# 调用主函数
if __name__ == "__main__":
main()
java
import java.util.*;
public class Main {
// 检查条件是否满足
public static boolean check(double c, String type) {
boolean mk = false;
switch (type) {
case ">":
mk = c > 0;
break;
case ">=":
mk = c >= 0;
break;
case "<":
mk = c < 0;
break;
case "<=":
mk = c <= 0;
break;
default:
mk = c == 0;
break;
}
return mk;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入的字符串
String s = scanner.nextLine();
// 将输入按';'分割
String[] str = s.split(";");
// 分别处理不同部分的字符串
String[] a1 = str[0].split(",");
String[] a2 = str[1].split(",");
String[] a3 = str[2].split(",");
String[] x = str[3].split(",");
String[] b = str[4].split(",");
String[] op = str[5].split(",");
// 计算res1, res2, res3
double res1 = Double.parseDouble(a1[0]) * Integer.parseInt(x[0]) +
Double.parseDouble(a1[1]) * Integer.parseInt(x[1]) +
Double.parseDouble(a1[2]) * Integer.parseInt(x[2]) +
Double.parseDouble(a1[3]) * Integer.parseInt(x[3]) +
Double.parseDouble(a1[4]) * Integer.parseInt(x[4]) -
Double.parseDouble(b[0]);
double res2 = Double.parseDouble(a2[0]) * Integer.parseInt(x[0]) +
Double.parseDouble(a2[1]) * Integer.parseInt(x[1]) +
Double.parseDouble(a2[2]) * Integer.parseInt(x[2]) +
Double.parseDouble(a2[3]) * Integer.parseInt(x[3]) +
Double.parseDouble(a2[4]) * Integer.parseInt(x[4]) -
Double.parseDouble(b[1]);
double res3 = Double.parseDouble(a3[0]) * Integer.parseInt(x[0]) +
Double.parseDouble(a3[1]) * Integer.parseInt(x[1]) +
Double.parseDouble(a3[2]) * Integer.parseInt(x[2]) +
Double.parseDouble(a3[3]) * Integer.parseInt(x[3]) +
Double.parseDouble(a3[4]) * Integer.parseInt(x[4]) -
Double.parseDouble(b[2]);
// 检查是否满足所有条件
boolean f = check(res1, op[0]) && check(res2, op[1]) && check(res3, op[2]);
// 计算最大的res值
double ans = Math.max(res1, Math.max(res2, res3));
// 输出结果
if (f) {
System.out.print("true ");
} else {
System.out.print("false ");
}
System.out.println((int) ans); // 输出整数部分
}
}
题目描述
给定一组不等式,判断是否成立并输出不等式的最大差(输出浮点数的整数部分)
要求:
- 不等式系数为 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,<=,<=,<=
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,最大差
样例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