任务
假设ppepole必须拆分钞票;每一个都由一个三元组标识,该三元组(Name, n, k)由以下各项组成:
Name:名称 ;n:他/他必须支付的金额;k:她/他实际支付的金额。
这里的挑战是找出谁欠谁的钱。
假设条件
输入和输出可以采用任何方便的格式。
pnkp名称是任意长度的唯一字符串,由小写字母字符组成。
解
解决方案以p人们之间的最小交易量为代表。特别是三元组(from, to, amount)
from:name给钱的人;to:name收钱者的;amount:交易金额。
注意:所有债务的总和(n)可能与所有已付金额的总和(k)不同。在这种情况下,您必须添加输出('owner', Name, amount)或(Name, 'owner', amount)所选的格式。任何名称都不会是owner。字符串'owner'是灵活的。
如果存在多个最小集合,则选择所有交易金额(绝对值)的总和最小的集合;如果是平局,选择其中之一。
测试用例:
inputs(Name,n,k):
[('a',30,40),('b',40,50),('c',30,15)]
[('a',30,30),('b',20,20)]
[('a',30,100),('b',30,2),('c',40,0)]
[('a',344,333),('b',344,200),('c',2,2)]
[('a',450,400),('b',300,300),('c',35,55)]
outputs(from, to, amount):
[('c','a',10),('c','b',5),('owner','b',5)] or [('c','b',10),('c','a',5),('owner','a',5)]
[]
[('owner','a',2),('b','a',28),('c','a',40)] PS: [('owner','a',2),('b','a',68),('c','b',40)] has the same number of transactions, but it is not a valid answer, because the total amount of its transaction is greater than that of the proposed solution.
[('a','owner',11),('b','owner',144)]
[('a','owner',30),('a','c',20)]
这是代码高尔夫:最短的代码胜出。
1
我认为您应该更改“您必须输出需要最少事务处理的最简化的方案。” “必须输出需要最少事务处理的方案。如果存在多个这样的方案,请选择总交易概念最少的方案。” 因为我相信这更清楚。
—
乔纳森·艾伦
很好的挑战。但这可能需要更复杂的测试用例,以确保解决方案始终是最佳的。
—
Arnauld
什么是“最小总概念”?
—
lirtosiast
@JonathanAllan仍然对“名义”一词感到困惑。那是哪里来的 根据测试用例3,看起来一个人应该更喜欢同一个人既不给予也不接受的答案?那是对的吗?还为什么将其描述为概念性的?
—
乔纳
@Jonah我使用“总概念”,因为不应考虑交易的方向(只是它们的绝对大小),尽管我现在意识到它有些多余(因为一旦打破平局就不会考虑两个相互抵消的交易) !)。[名义上只是金融中使用的术语。]
—
乔纳森·艾伦