游戏规则观察课:合作补给按缺口均分与剩余额度——五人缺口[0, 6, 8, 12, 1]与8单位补给(练习26)
给多名角色均分补给时,已经接近上限的人可能用不完同等份额。把用不完的部分继续分给仍有缺口的人,和每人先固定一份再丢弃剩余,是不同的规则。
下面使用独立的一组输入,逐步记录规则如何产生结果。建议先自行推演,再寻找与记录第一次不同的位置;检查时间单位、端点归属和处理顺序。所有约定均限定在本例中,其他作品采用不同实现并不自动意味着出错。
本例约定与输入
本例补给是虚构整数资源,每名角色有确定缺口;每轮按编号依次给仍有缺口者一单位,直到补给耗尽或所有缺口填满。未用完的补给保留;只讨论资源分配,不涉及真实医疗或金钱。
五名角色缺口[0, 6, 8, 12, 1],初始补给8
过程与结果
第1轮给编号[1, 2, 3, 4]各一单位,累计分配[0, 1, 1, 1, 1],尚余补给4,剩余缺口[0, 5, 7, 11, 0]。
第2轮给编号[1, 2, 3]各一单位,累计分配[0, 2, 2, 2, 1],尚余补给1,剩余缺口[0, 4, 6, 10, 0]。
第3轮给编号[1]各一单位,累计分配[0, 3, 2, 2, 1],尚余补给0,剩余缺口[0, 3, 6, 10, 0]。
最终分配[0, 3, 2, 2, 1],共8,保留0;分配加保留等于8。
如何独立复核
寻找大家共同能达到的分配层数,再把不足一整轮的余数按编号给仍未满者,与逐单位循环结果比较。总分配不能超过补给量,也不能超过总缺口。
编号决定最后不足一整轮时的先后,并不表示每个人永远得到同样总量;缺口小的人提前填满后会退出分配。若要跨多次补给轮换余数优先权,应另外保存起始编号,本例每次都从零号开始。还可以把每轮理解为同时抬高一层水位:先计算每人达到这一层所需的数量,已填满的角色不再参与。找到补给足以完成的最高整层后,再把余数按编号发给尚未填满的人,就能独立核对逐轮记录。如果总补给超过全部缺口,多出的单位必须保留,不能强行分给已经满额的人;如果补给在一轮中间用尽,后面的角色只在本轮没有拿到,不能误判为永远退出。初始缺口为零的人从第一轮起就跳过,但仍保留在结果列表中。
测试时保留原始数据与中间状态,再只改变一个条件作比较。先检查空状态、相等边界、重复输入和最后一步,再比较整体结果;不要为了让最后的数字相同而跳过前面已经出现的差异。明确规则后,复核才有可以重复的依据。