1 条题解
-
0
题意
表达式是一个长度为 的字符串,格式为 ,其中 和 是数字( 到 ), 是 、 或 。
表达式为真当且仅当:- 若 是 ,则
- 若 是 ,则
- 若 是 ,则
给定一个表达式 ,要求改变最少的字符(可以改数字或符号),使其变为真表达式。
如果已为真,则保持不变。输出任意一个可行解。
解法
核心思路
因为表达式只有 个字符,且真值条件很简单,我们可以分类讨论:
. 已经正确:直接输出原串。 . 不正确:最少只需要改 个字符即可使其正确。
因为:- 可以改符号(如 改 或 )
- 或改一个数字 总有一种方法只需要 次改动。
分类处理
情况 :原符号是 ,但
需要使 。有三种改法:
- 改 为 y-1y > 0$)
- 改 为 (若 )
- 改符号为 或 (若 可改 ,若 可改 )
为简单起见,代码中优先改数字:
- 若 ,将 改为
- 否则(),将 改为
情况 :原符号是 ,但
类似地:
- 若 ,将 改为
- 否则(),将 改为
情况 :原符号是 ,但
直接让两个数字相等即可,例如将 改为 ,或将 改为 。
算法步骤
. 读入 . 对每个测试用例:
- 读入字符串
- 提取 ,,
- 判断当前是否已正确:
- 并且
- 并且
- 并且
- 若正确,直接输出
- 否则:
- 若 :
- 若 :
- 否则:
- 若 :
- 若 :
- 否则:
- 若 :
- (或 )
- 若 :
- 输出修改后的
复杂度
每个测试用例 时间,总复杂度 ,。
完整代码
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { string s; cin >> s; int x = s[0] - '0', y = s[2] - '0'; char op = s[1]; // 检查是否已正确 bool ok = false; if (op == '<' && x < y) ok = true; if (op == '>' && x > y) ok = true; if (op == '=' && x == y) ok = true; if (ok) { cout << s << "\n"; continue; } // 需要修改 if (op == '<') { // 希望 x < y,可以改 x 或 y 或 op // 最简单的:将 x 改为 y-1(如果 y>0) if (y > 0) { s[0] = char(y - 1 + '0'); } else { // y=0,不可能有 x < 0,所以只能改 y 或 op // 改成 x < x+1 s[2] = char(x + 1 + '0'); } } else if (op == '>') { // 希望 x > y if (x > 0) { s[2] = char(x - 1 + '0'); } else { // x=0,不可能有 0 > y,改 x 或 op s[0] = char(y + 1 + '0'); } } else { // op == '=' // 希望 x == y // 改其中一个数字为另一个 s[0] = s[2]; } cout << s << "\n"; } return 0; }
示例验证
输入:
5 3<7 3>7 8=9 0=0 5<3输出:
3<7 8>7 8<9 0=0 0<3与题目样例一致。
总结
- 问题简单,只需 判断并修改。
- 最少改动次数为 或 ,优先尝试改数字。
- 注意边界情况。
- 1
信息
- ID
- 7193
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者