我正在度过我的晚上从Kattis做一些编程问题。我坚持认为问题的一部分是4 thought。
给定一个数字,该程序应该返回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。
您是否可以想到一种重写功能的方法,以便评估遵循操作顺序?
提前致谢!
答案 0 :(得分:0)
如果你看一下它就是一个简单的问题。
您被限制为四个4和三个运算符介于两者之间,即您已经知道您的搜索空间。因此,一种解决方案是生成完整的搜索空间,即O(n ^ 3)= 4 ^ 3 = 64个总方程,其中n是运算符的数量。将这些解决方案的答案保留为<key, value>
对,以便查看测试用例的输入为O(1)。
你会逐步做到。
(大部分内容不完整):
// 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
}
}