市赛很糟糕,差点连市队都没进。
1.数学题,结果要用高精输出。
2.DP,有一个状态忘记转移了。。爆0
3.SPFA。
4.说不清是什么算法,所以我们重点来讨论一下第四题。
/*考试的时候一直在找O(n)的算法。。。。。结果10分
回家后用了一个类似于贪心的算法。
递降time,维护一个heap,每次卖出最有价值的。
在linux下用set写的AC,pritory__queue写的超时2个点。
结果在cena下pritory__queue,AC,set:90(TLE)
然后在windows手测,发现set反而更快。
发现cena严重糟搞。
还有最后一个点错了,。out是超出longint后溢出的结果。。。*/
其实仔细想想这是一个贪心问题,二其考察点在于数据的处理。
显然在一组可行解中,价值商品比价值小的好,时间早的比时间迟的好。
我的第一种解法,就是枚举time递降(考虑最坏情况),
维护比卖出在当前时刻可以卖出的最大价值的商品。实现时就是一个堆。
但存在有时间点上没有任何商品能卖出,所以时间有一定的浪费。
T(n)=O(nlogn)。说过了,这时间复杂度有一点悬。
后来听闻了另一种解法。按价值从大到小选取商品,将它放在它可以卖出的最后的时间点上。
当然存在这一时间点上已经有物品放置了,
所以我们需要维护一个数组pre[x]表示x时间前的第一个空闲时间。
这里可以想到用并查集,当然这不是常规的并查集,合并时pre[x]转化成最小的pre[i]。
T(n)=O(nα(n))是足矣的。由于我前面漏了一节LCA和RMQ的课,Tarjan还不会写,想不到很正常。
发现贪心的题目一直不是很擅长。
继续总结,
1.找到必胜态(贪心终止条件,也可以认为是其实条件。有时没有。)
2.发现单调性(这一步就是比较不同状态的优劣性,发现深层次的问题。)
3.研究转化策略(怎样从一个状态到必胜态,怎样转化成一个更优的状态)
有时候要做一些最坏的假设。