【问题标题】:Keeping the order of operations while doing a sequential calculation在进行顺序计算时保持操作顺序
【发布时间】:2017-07-17 19:46:40
【问题描述】:

我整个晚上都在做一些来自 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。

你们中的任何人都可以想出一种方法来重写函数以使评估遵循操作顺序吗?

提前致谢!

【问题讨论】:

    标签: c++ operators


    【解决方案1】:

    如果你看它,这是一个简单的问题。

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

    明智地你会这样做。

    1. 生成完整序列并将它们存储为键、值对
    2. 从测试用例中获取输入
    3. 检查key是否存在,如果存在则打印序列,否则打印序列不存在
    4. 解决方案需要 64*1000 次操作,可以在一秒钟内轻松计算出来,并且可以避免这些比赛通常存在的 Time Limit Exceeded Error

    代码形式(大部分不完整):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-11
      • 2020-02-12
      • 2012-06-22
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多