4.7小红书笔试 求第二题解法

小红发布n篇笔记,第i篇笔记的点赞数为a_i,评论数为b_i,选取k篇作为合集,合集的优秀程度为合集中笔记的点赞数之和乘以评论数的最小值。求最大的合集优秀程度。
样例:第一行为n,k。第二行为点赞数,第三行为评论数
4 2
1 2 3 4
3 4 2 1

output:
10
全部评论
按评论数从大到小排序 遍历的时候用一个小根堆保存当前最大的k个点赞数
1 回复
分享
发布于 04-07 21:33 湖南
理解乘最小的就行,即你的和再大,你的乘数小,结果也是小。所以先按照评论数从大到小排序,前K个优秀程度就是当前的sum*评论[k-1],后面就是遍历就行,只有当当前的sum会变大的情况下,才考虑计算【因为评论数呈现非递增排序,所以后面的乘数一定是<=当前的】
1 回复
分享
发布于 04-08 12:58 广东
联易融
校招火热招聘中
官网直投
动态规划过73%
点赞 回复
分享
发布于 04-07 23:20 上海
cy
点赞 回复
分享
发布于 04-17 11:00 江苏

相关推荐

选择题跳过。编程题三题T1&nbsp;签到,排序去重即可。T2&nbsp;问刚好等于x。考虑01背包(下标从1开始)。dp[i][j][k]表示到第i个数,总共选取了j个,k=0表示[1~i]都没多次操作(都没加倍)。k=1表示[1~i]存在加倍的情况,可能是i,也可能是之前的某次。列出状态转移方程:dp[i][j][0]&nbsp;=&nbsp;min(dp[i-1][j][0],&nbsp;dp[i-1][j-a[i]/2][0]+1)&nbsp;表示不选和选的情况。dp[i][j][1]&nbsp;=&nbsp;min(dp[i-1][j][1],&nbsp;dp[i-1][j-a[i]/2][1]+1,&nbsp;dp[i-1][j-a[i]][0]+1)&nbsp;表示不选、选择但是不多次操作、选择并多次操作的情况。最后输出min(dp[n][x][0],dp[n][x][1])即可,若为inf则输出-1.第一维可以优化掉,空间O(x),时间O(nx)。T3&nbsp;样例给的比较号是&amp;lt;和&amp;gt;这种,很神秘,最后发现直接改成都行。也考虑dp。先把等号去掉,那个不影响答案。假设有len个运算符dp[i][j]表示到第i个运算符右侧的数,选择j,所得到的方案数。如果第i个运算符是 >&nbsp;,说明右侧的数更小,则&nbsp;dp[i][j]&nbsp;=&nbsp;dp[i-1][j+1]&nbsp;+&nbsp;dp[i-1][j+2]&nbsp;+&nbsp;...&nbsp;+&nbsp;dp[i-1][m]如果第i个运算符是 初始化dp[0][1~m]&nbsp;=&nbsp;1,表示最左侧的数取任何数的方案数都是1最后对dp[len][1~m]求和即可。当然直接算会超时,毕竟要求和。实际上如果第i个运算符是 >,那么由于dp[i][j+1]&nbsp;=&nbsp;dp[i-1][j+2]&nbsp;+&nbsp;...&nbsp;+&nbsp;dp[i-1][m],因此dp[i][j]&nbsp;=&nbsp;dp[i][j+1]&nbsp;+&nbsp;dp[i-1][j+1]。同理如果第i个运算符是 由于i只用到2个,因此可以压缩一维到大小为2.最后空间复杂度O(2*m)&nbsp;=&nbsp;O(m),时间复杂度O(n*m)#笔试##小红书#
投递小红书等公司9个岗位
点赞 评论 收藏
转发
1 2 评论
分享
牛客网
牛客企业服务