BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #101004同步于 2023/4/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

字节面试一道题 暴力超时 我太菜求个ON思路

chance21
2023/4/24镜像同步8 回复
给定n组任务和时间t,要求在t时间内选择两个任务,使得两任务的value之和最大。 输入首先会给你一个time数组,表示第i个任务要花费的时间,time按照花费时间从小到大顺序给出。 其次有一个value数组,表示第i个任务的价值。 两者一一对应表示每一个任务的时间和价值。
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
chance21机器人#1 · 2023/4/24
好像表述有点问题,要求选出两个任务,这两个任务花费的时间和小于等于T,价值和最大
chaoese机器人#2 · 2023/4/24
按value排一下序,感觉双指针可以吧,一个时长最短开始一个从value最高开始,计算包含第i个任务的最大value和,最后取个最大值就可以了
intmain机器人#3 · 2023/4/24
i遍历0到n-1,记录maxvalue[i]为value[0到i]的最大值,那么对于取任务i为第2个任务时,第1个任务可以在logn复杂度内找到。整体下来复杂度在nlogn
Wizmann机器人#4 · 2023/4/24
```python n = int(raw_input()) T = int(raw_input()) ts = map(int, raw_input().split()) vs = map(int, raw_input().split()) tasks1 = sorted(zip(ts, vs), key=lambda (t, v): (t, -v)) tasks2 = tasks1[:] for i in xrange(1, n): tasks1[i][1] = max(tasks1[i][1], tasks1[i - 1][1]) res = 0 p, q = 0, n - 1 while p < q and q > 0: t2 = tasks2[q][0] v2 = tasks2[q][1] while p < q and tasks1[p][0] + t2 < T: p += 1 res = max(res, tasks1[p][1] + v2) q -= 1 p = min(p, q - 1) print res ``` 瞎写的,对错难料(
wolf5x机器人#5 · 2023/5/4
你这个思路再进一步就有O(n)的解法了: 第1个任务可以在1复杂度内找到 双指针扫time数组,p=1, q=n,保持time[p]+time[q]是选中q的情况下,p能取的最大值。这个情况下的最大收益就是value[q]+max{value[1..p]}。q从n开始减小,p是只增不减的,就可以把logn干掉。 ``` p = 1 q = n while (p < q): while (p < q && time[p]+time[q] <= T): ans = max(ans, value[q]+maxvalue[p]) p++ q-- return ans ``` 进一步,因为p只增不减,maxvalue[]数组也可以干掉,只用一个max_value_on_the_left: ``` p = 1 q = n max_value_on_the_left = 0 while (p < q): while (p < q && time[p]+time[q] <= T): max_value_on_the_left = max(max_value_on_the_left, value[p]) ans = max(ans, value[q] + max_value_on_the_left) p++ q-- return ans ``` 【 在 intmain 的大作中提到: 】 : i遍历0到n-1,记录maxvalue[i]为value[0到i]的最大值,那么对于取任务i为第2个任务时,第1个任务可以在logn复杂度内找到。整体下来复杂度在nlogn
zhudy机器人#6 · 2023/5/4
没仔细看,感觉是01背包问题的变形
a940100079机器人#7 · 2023/5/4
on的方案 建立一个新的n*2的数据 每一个表示到当前数据时间为止,最大的2个value(也可以用index) 然后用左右指针,就可以了
Saerdna机器人#8 · 2023/9/15
仰慕上古神牛 【 在 wolf5x 的大作中提到: 】 : [md] : 你这个思路再进一步就有O(n)的解法了: 第1个任务可以在1复杂度内找到 : 双指针扫time数组,p=1, q=n,保持time[p]+time[q]是选中q的情况下,p能取的最大值。这个情况下的最大收益就是value[q]+max{value[1..p]}。q从n开始减小,p是只增不减的,就可以把logn干掉。 : ...................