在进行顺序计算时保持操作顺序
Keeping the order of operations while doing a sequential calculation
我晚上正在做Kattis的一些编程问题。问题 4 的一部分认为我坚持了下来。
给定一个数字,程序应该返回实现该数字所需的运算(+,-,*或/(,介于4个四之间。
例如,输入
9
将导致输出
4 + 4 + 4 / 4 = 9
我的解决方案(效率不高,但很简单(是评估组合上述运算符的所有可能方法,看看是否有任何组合达到了预期的结果。
为此,我编写了如下所示的函数。它接受一个字符数组,这些字符是要计算的运算符(uo[3]
,可能看起来像{+, /, *}
(,以及整数(expRes
(所需的结果。
bool check(char uo[3], int expRes) {
int res = 4;
for(int oPos = 2; oPos >= 0; oPos--) {
switch (uo[oPos]) {
case '+' : res += 4; break;
case '-' : res -= 4; break;
case '*' : res *= 4; break;
case '/' : res /= 4; break;
}
}
return res == expRes;
}
我意识到这种"顺序"方法带来了一个问题:它不遵循操作顺序。如果我要调用该函数uo = {+, -, /}
和expRes = 7
它会返回 false,因为 4 + 4 = 8, 8 - 4 = 4, 4/4 = 1。 真正的答案显然是正确的,因为 4 + 4 - 4/4 = 7。
你们中有人能想到一种方法来重写函数,以便计算遵循操作顺序吗?
提前感谢!
如果你看一下,这是一个简单的问题。
您被限制为四个 4 和三个运算符,也就是说您已经知道您的搜索空间。因此,一种解决方案是生成完整的搜索空间,即 O(n^3( = 4^3 = 64 个总方程,其中 n 是运算符的数量。将这些解决方案的答案保留为<key, value>
对,以便查找测试用例的输入为 O(1(。
一步一步地做。
- 生成完整序列并将其存储为键、值对
- 从测试用例中获取输入
- 检查键是否存在,如果是,则打印序列,否则打印序列不存在
- 解决方案将需要 64*1000 次操作,这可以在一秒钟内轻松计算,并且可以避免通常这些比赛具有的时间限制超出错误
在代码形式中(其中大部分不完整(:
// C++ Syntax
map<int, string> mp;
void generateAll() {
// generate all equations
}
void main () {
generateAll();
int n, t; scanf("%d", &t);
while (t--) {
scanf("%d", &n);
if ( mp.find(n) != mp.end() )
// equation exists to the input
else
// equation doesn't exist for the input
}
}
相关文章:
- 标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?
- C++和PEMDAS的优先顺序/操作?
- 内存排序或读取-修改-写入操作,仅(读/写)内存顺序
- 如果 RMW 操作没有任何变化,是否可以针对所有内存顺序对其进行优化
- MPI 归约操作中的求和顺序
- 操作顺序以最大限度地提高精度
- 在进行顺序计算时保持操作顺序
- 编译器是否会简化按顺序执行多次的操作
- 在C++中,当表达式涉及对象时,将表达式赋值到对象中时,是否有定义的操作顺序?
- 更改操作的构造函数顺序
- C 操作顺序和模量
- 发行语义中的内存操作 - C 11的内存顺序
- C 的操作顺序用于初始化数组大小
- ASIO IO完成回调订单与实际IO操作的顺序
- 对同一对象进行评估的链接操作和顺序
- 在 boost::asio 中启动异步操作和运行io_service的正确顺序
- 访问类成员的C++操作顺序
- Qt - 解决一个插槽上的两个顺序调用,并且仅执行一次操作
- C++队列中读/写操作的顺序
- C++ 输入流:Solaris 与 Linux 中的操作顺序