Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 28c3a0a

Browse files
Create Readme.md
1 parent 184933f commit 28c3a0a

File tree

1 file changed

+11
-0
lines changed
  • Greedy/2412.Minimum-Money-Required-Before-Transactions

1 file changed

+11
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
### 2412.Minimum-Money-Required-Before-Transactions
2+
3+
本题在排序的时候会有这么几点思路:应该把cost大的放在前面,这样提高门槛,从而就对初始资金的要求更高。也应该把净亏损最大的放在前面,这样让手头的现金尽早为负,从而也不得不提升初始资金。那么我们如何平衡这两者的关系呢?事实上,强行从这方面想并不可行。
4+
5+
我们考虑将所有交易分成两大类。
6+
7+
首先,对于能够有净赚的交易,必然会使得手头的现金越来越宽裕。所以为了提高初始难度,必然要把这些能净赚的项目放在最后去做。同时,对于这些净赚的项目,我们必然要把cost最高的放第一个。因为我们把门槛低的先做的话,会使得手头的资金得到增长,可能会更轻松地跨越原本门槛更高的其他交易。所以我们将所有净赚的交易按照cost降序排列:如果我们能有资本启动第一个项目,那么其他项目自然也能完成。我们记第一个项目的门槛是 maxCostForNetGain.
8+
9+
其次,对于净亏的交易,我们该如何安排呢?因为是净亏,所以越做资本越少,等到做最后一个交易之前,资本是历史上的最低点。我们要增加难度的话,需要将在这个历史最低点之后,跟上一个门槛比较高的交易。这个差值是全局最大的挑战。我们来分析一下这个时刻:假设我们挑选最后一个交易的净亏项目是`(cost, back)`,那么在它之前,我们的总资产,即净亏总额是`totalLoss - (back-cost)`,注意这是一个负数,且totalLoss是所有亏损交易的总净亏额。此时我们想要从净亏跳跃至能够着cost的门槛,其中的差距是`diff = cost - (totalLoss - (back-cost)) = back - totalLoss`. 我们发现,`totalLoss`是一个常量,所以要最大化`diff`,只需要寻找`back`最大的交易即可。
10+
11+
于是依次类推,对于倒数第二个净亏交易,我们也选剩下的里面`back`最大的...所以我们对于所有的净亏交易,只要按照back递增排序即可。然后对于所有的净赚交易,按照cost递减排序即可。

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /