困难的算法:徽章平衡,数学分布

时间:2012-05-30 03:07:01

标签: php algorithm math logic

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

每当用户有可用的“更高”徽章分发时,就会发生这种情况。例如,如果他有8枚青铜徽章,4枚银徽章和4枚金徽章,他可以将其2枚金徽章“转换”为青铜徽章,将1枚转换为银牌,以获得特殊徽章。

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

3 个答案:

答案 0 :(得分:5)

用户需要至少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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  1. 带走一枚金徽章。
  2. 将所有剩余的金徽章转换为银牌。
  3. 带走五枚银色徽章。
  4. 将所有剩余的银色徽章转换为青铜徽章。
  5. 带走10枚青铜徽章。
  6. 如果任何“带走”步骤失败,那么他们就没有资格获得徽章。这很简单,将其修改为其他徽章数量或汇率是微不足道的。