¶题意
给定长度为$n$的数组nums1
和nums2
,在每一秒,每个nums1[i]
会增加nums2[i]
,然后你可以选择一个数将其置0,问你使nums1
中所有数的和小于等于$x$的最少用时。
$1\le n \le 1000, 1\le nums1[i] \le 1000, 0\le nums2[i] \le 1000, 0\le x \le 10^6$
¶做法
每日一题没做出来😭。
显然对一个位置$i$至多只会操作1次,因为如果操作多次,那么除了最后一次,前几次都是没有意义的,还不如用来操作别的位置。因此用时上限是$n$,否则就是永远不行(-1)。
如果固定操作的$t$个位置,显然应该按照nums2
从小到大置0的收益是最大的。
现在的问题就是这$t$个位置怎么选?这一步我没想出来,一直在想贪心的方法,当时脑子也晕晕的🤡。
考虑将所有数按照nums2
从小到大排序,那么第$i$个选择的数$j$就应该在第$i$天操作,它能带来的贡献就是省下$nums1[j] + i * nums2[j]$。想到这里应该很容易想到$dp[i][j]$表示考虑了前$i$个数,选择了$j$个能带来的最大贡献。然后就做完了。。。$O(n^2)$
代码都不是我自己写的,偷懒CV的
notes:rust写算法题优先选用sort_unstable
。这个DP就是个01背包,所以可以省掉第一维,然后倒序DP。
1 | impl Solution { |