贪心算法,每次先选当前价值(price)最大的product[i],如果product[i].deadline之前有哪天还没被占用,则ans+= product[i]. price,并把product[i]占用的那一天标记。
实现:读入数据,按照product.price排序,从price大的一端开始遍历product。现在核心的问题是:如何快速确定product[i].deadline前的哪一天还没被占用。
想法1:用个数组used[i]记录,每次要用的时候就遍历。有点费时间,但我用这样的方法也AC。
想法2:利用并查集的数据结构。Find(deadline)返回k,其中满足(k<=deadline,时间k是离deadline最近的没被占用的时间),也就是说每个集合的根节点记录一个当前空闲的节点且该节点离所有非根节点最近。当确定需要使用第k段时间,则Union(k,k-1)既可(因为k之前还没占用,所以k必然是根节点,利用这个性质可以化简Union操作)。
说得不是很清楚,具体见代码吧。