在进行顺序计算时保持操作顺序

时间:2017-07-17 19:46:40

标签: c++ operators

我正在度过我的晚上从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。

您是否可以想到一种重写功能的方法,以便评估遵循操作顺序?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果你看一下它就是一个简单的问题。

您被限制为四个4和三个运算符介于两者之间,即您已经知道您的搜索空间。因此,一种解决方案是生成完整的搜索空间,即O(n ^ 3)= 4 ^ 3 = 64个总方程,其中n是运算符的数量。将这些解决方案的答案保留为<key, value>对,以便查看测试用例的输入为O(1)。

你会逐步做到。

  1. 生成完整序列并将其存储为键值对
  2. 从测试用例中获取输入
  3. 检查密钥是否存在,如果是,则打印序列,否则打印序列不存在
  4. 解决方案将需要64 * 1000次操作,这可以在一秒钟内轻松计算,并且可以避免时间限制超出错误,通常这些比赛有
  5. 代码表单中的

    (大部分内容不完整):

    // 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
        }
    }