求解答一道算法题

2019-09-22 21:36:58 +08:00
 codechaser

/**

求问这道题怎么做?

4248 次点击
所在节点    程序员
28 条回复
layorlayor
2019-09-23 14:43:57 +08:00
对于一个数 x, 它有 cx 个。比他小的最大数是 y,有 cy 个。比他大的最小数是 z,有 cz 个。 那是不是按照 x * cx - y * cy - z * cz 降序,然后一个一个挑?
brainfxxk
2019-09-23 15:59:20 +08:00
@no1xsyzy 个数为什么没限制,每次操作会删掉 3 个元素呀。
no1xsyzy
2019-09-23 18:13:49 +08:00
@brainfxxk 不一定,如果删的是两头的只会删掉两个,如果最后只剩一个只会删掉一个
brainfxxk
2019-09-23 18:30:05 +08:00
@no1xsyzy 啊是的,也就是如果删除的元素不一定需要有前驱和后继,那么总长度也不需要满足 3 的倍数了。
BiteTheDust
2019-09-23 20:10:07 +08:00
首先可以发现原序列没有用
我们把每个值来排序 然后根据每个值的出现次数 使得这个值获得一个权值 得到一个新的序列
显然对于这个新序列 我们不能连续地去取里面的值(也就是说我们取了某个数 就不能取相邻的数)
这样转化后我们就可以用动态规划来获得最大的总和 如果值域不大复杂度可以达到 O(n) 否则复杂度瓶颈为 nlogn 的排序
nvioue
2019-09-24 00:10:23 +08:00
不知所云 上 leetcode 链接吧 求你了
codechaser
2019-09-24 08:38:16 +08:00
@nvioue 题目的意思就是给出一个数组,你每次可以选择一个值 x,先删除数组中值为 x 的所有元素,用被删除元素个数 n_x 乘以 x 当做这次拿到的资源值,然后删去数组中正好比 x 大和 x 小的所有元素(如[2,4,4,1,5,3,6,3],x 选 6 的话,总共要删去 6,4,4 这几个元素,资源值为 6。)这样算一次操作,若干次操作后数组会空,问加在一起最大能拿到多少资源值?我不知道这个 leetcode 上有不,这是笔试题,当时就随手记了一下。
no1xsyzy
2019-09-24 15:56:26 +08:00
@nvioue 简单地说:
Given X: uint[], n = len(X)
Require x in X while len(X) > 0
Do
X.remove(x)
X.remove(min(a for a in X if a > x))
X.remove(max(a for a in X if a < x))

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/603137

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX