【问题标题】:Difficult algorithm: badge balancing, math distribution难点算法:徽章平衡、数学分布
【发布时间】:2012-05-30 03:07:01
【问题描述】:

我有一个非常有趣的问题让我头疼。我正在开发一个由用户和奖励(称为徽章)组成的小型系统。根据以下标准授予用户一个特殊徽章:10 个青铜徽章、5 个银徽章和 1 个金徽章。这很简单,但是,如果用户有 8 个青铜徽章、7 个银徽章和 1 个金徽章,他可以将他的 2 个额外的银徽章用作铜徽章。

每当用户有可用的“更高”徽章可分发时,都会发生这种情况。再比如,如果他有 8 个青铜徽章、4 个银徽章和 4 个金徽章,他可以将他的 2 个金徽章“转化”为青铜,1 个转化为银,以获得特殊徽章。

我完全不知道该怎么做。我尝试过各种循环,ifs,但我永远无法正确分配。也许有人可以帮助我?

【问题讨论】:

    标签: php algorithm math logic


    【解决方案1】:

    用户需要至少 1 个金徽章,至少 6 个银或金徽章,以及至少 16 个青铜、银或金徽章。

    伪代码是

    count(gold) >= 1
    && count(gold) + count(silver) >= 6
    && count(gold) + count(silver) + count(bronze) >= 16
    

    如果您还有可以换成金、银或铜牌的钻石奖牌,那么也包括它,例如

    count(diamond) + count(gold) >= 1
    && count(diamond) + count(gold) + count(silver) >= 6
    // etc
    

    或者你可以使用“奖牌等级”,这样你就可以做一些更简单的事情,比如

    count(rank of gold or higher) >= 1
    && count(rank of silver or higher) >= 6
    && count(rank of bronze or higher) >= 16
    

    【讨论】:

    • 如果我有高于黄金的东西可以为 0 怎么办?例如,钻石。用户至少需要1金、5银、10铜,但如果有钻石,就可以“变身”成其他人。
    【解决方案2】:
    $bank['g'] -= $price['g'];
    $bank['s'] -= $price['s'];
    $bank['b'] -= $price['b'];
    if ($bank['b'] < 0) {
        $bank['s'] += $bank['b'];
        $bank['b'] = 0;
    }
    if ($bank['s'] < 0) {
        $bank['g'] += $bank['s'];
        $bank['s'] = 0;
    }
    if ($bank['g'] < 0) {
        //not enough cash
    } else {
        //ok
    }
    

    【讨论】:

      【解决方案3】:

      一种方法是从“最高”徽章开始,减去所需的数字,然后将其余部分转换为下一个徽章。所以:

      1. 拿走一枚金徽章。
      2. 将所有剩余的金色徽章转换为银色。
      3. 拿走五枚银质徽章。
      4. 将所有剩余的银色徽章转换为青铜。
      5. 拿走 10 个青铜徽章。

      如果任何“带走”步骤失败,则他们没有资格获得徽章。这很简单,修改其他徽章数量或汇率也很简单。

      【讨论】:

      • 如果我有高于黄金的东西可以为 0 怎么办?例如,钻石。用户至少需要1金、5银、10铜,但如果有钻石,就可以“变身”成其他人。
      • @vinnylinux 那么前两个步骤将是“带走零钻石徽章”和“将所有剩余的[即所有]钻石徽章转换为金徽章。”
      猜你喜欢
      • 2018-04-11
      • 2017-03-26
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2013-11-22
      • 1970-01-01
      相关资源
      最近更新 更多