avatar
a*a
1
如果你和另外两个朋友出去玩,每个人付一部分钱,比如你掏了car rent, 另一个人
付了hotel等等。最后回家了,你们想AA,最后你们每个人付的钱都一样,写个方法能
返回谁应该给谁多少钱
比如三个人分别掏了5,3,1,那么a[2]应该给a[0] 2 刀
如果现在有n个人的话,应该怎么办
写完了之后,大哥问,最需要多少次transaction,一个人给另一个人钱的话算一次,
我心想的是 O(n – 1) 就是 O(n), 大哥说specific answer, 就是 n – 1次
然后Follow up,如果每次transaction特别麻烦,不管是时间还是空间都特别麻烦。如
果不用考虑everything, 不考虑cpu, 不考虑硬盘,我们想让这个次数最少,怎么办。
avatar
a*e
2
前部分是个经典题。
后部分不太明白,有例子吗?

办。

【在 a*****a 的大作中提到】
: 如果你和另外两个朋友出去玩,每个人付一部分钱,比如你掏了car rent, 另一个人
: 付了hotel等等。最后回家了,你们想AA,最后你们每个人付的钱都一样,写个方法能
: 返回谁应该给谁多少钱
: 比如三个人分别掏了5,3,1,那么a[2]应该给a[0] 2 刀
: 如果现在有n个人的话,应该怎么办
: 写完了之后,大哥问,最需要多少次transaction,一个人给另一个人钱的话算一次,
: 我心想的是 O(n – 1) 就是 O(n), 大哥说specific answer, 就是 n – 1次
: 然后Follow up,如果每次transaction特别麻烦,不管是时间还是空间都特别麻烦。如
: 果不用考虑everything, 不考虑cpu, 不考虑硬盘,我们想让这个次数最少,怎么办。

avatar
T*1
3
最少,最少,是零次。如果每个人刚好花的钱时平均数。

办。

【在 a*****a 的大作中提到】
: 如果你和另外两个朋友出去玩,每个人付一部分钱,比如你掏了car rent, 另一个人
: 付了hotel等等。最后回家了,你们想AA,最后你们每个人付的钱都一样,写个方法能
: 返回谁应该给谁多少钱
: 比如三个人分别掏了5,3,1,那么a[2]应该给a[0] 2 刀
: 如果现在有n个人的话,应该怎么办
: 写完了之后,大哥问,最需要多少次transaction,一个人给另一个人钱的话算一次,
: 我心想的是 O(n – 1) 就是 O(n), 大哥说specific answer, 就是 n – 1次
: 然后Follow up,如果每次transaction特别麻烦,不管是时间还是空间都特别麻烦。如
: 果不用考虑everything, 不考虑cpu, 不考虑硬盘,我们想让这个次数最少,怎么办。

avatar
p*2
4
换了我就说,你丫真抠门,我请客!

办。

【在 a*****a 的大作中提到】
: 如果你和另外两个朋友出去玩,每个人付一部分钱,比如你掏了car rent, 另一个人
: 付了hotel等等。最后回家了,你们想AA,最后你们每个人付的钱都一样,写个方法能
: 返回谁应该给谁多少钱
: 比如三个人分别掏了5,3,1,那么a[2]应该给a[0] 2 刀
: 如果现在有n个人的话,应该怎么办
: 写完了之后,大哥问,最需要多少次transaction,一个人给另一个人钱的话算一次,
: 我心想的是 O(n – 1) 就是 O(n), 大哥说specific answer, 就是 n – 1次
: 然后Follow up,如果每次transaction特别麻烦,不管是时间还是空间都特别麻烦。如
: 果不用考虑everything, 不考虑cpu, 不考虑硬盘,我们想让这个次数最少,怎么办。

avatar
m*0
5
这个follow up我猜是这个意思:
假设有m个人需要给钱,数目为give[0 ... m-1],然后有n个人需要收钱,数目为
receive[0 ... n-1],(sum(give)=sum(receive))
如果give[i]==receive[j], 那么i给j的钱正好,就是一次交易。如果give[5]=10,
receive[3]=4, receive[8]=6, 那么5要分别给3、8各一次钱,就是2次交易。
现在给定give[]和receive[], 需要求最少交易次数。
想了半天没找到dp的做法,能想到的只有硬搜了,用递归是比较好实现的。有人想到更
好的解法请post。
// 硬搜
int dfs() {
int ans=INT_MAX;
for (int& g : give)
for (int& r : receive)
if (g>0 && r>0) {
int num = min(g,r);
g-=num, r-=num;
ans = min(ans, dfs());
g+=num, r+=num;
}
return ans==INT_MAX ? 0 : ans;
}

办。

【在 a*****a 的大作中提到】
: 如果你和另外两个朋友出去玩,每个人付一部分钱,比如你掏了car rent, 另一个人
: 付了hotel等等。最后回家了,你们想AA,最后你们每个人付的钱都一样,写个方法能
: 返回谁应该给谁多少钱
: 比如三个人分别掏了5,3,1,那么a[2]应该给a[0] 2 刀
: 如果现在有n个人的话,应该怎么办
: 写完了之后,大哥问,最需要多少次transaction,一个人给另一个人钱的话算一次,
: 我心想的是 O(n – 1) 就是 O(n), 大哥说specific answer, 就是 n – 1次
: 然后Follow up,如果每次transaction特别麻烦,不管是时间还是空间都特别麻烦。如
: 果不用考虑everything, 不考虑cpu, 不考虑硬盘,我们想让这个次数最少,怎么办。

avatar
a*a
6
后来我认真想了一下,面试官估计希望用bfs来做,每一步无非就是一个人给了另外一
个人一点钱。然后用这些人付出的钱做状态,然后做遍历就好了,到了大家付出的钱一
样的时候就是最少的步骤。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。