大概已经8-9个月没有正常地打一次比赛了,题目不难,但感觉就不是很对了
没想到中考试卷到处是病毒,模拟赛试卷也有病毒……
数据范围N是十万级别,其余都是十亿
首先,一看完题,就知道这是本场比赛的签到题,然而我因为太久没打比赛怎么签到都忘了???
对于任何一种情况,最左边的那个肯定是要杀掉的,而且肯定是施展魔法范围的最左端,因此考虑一个队列存每一个之前没有被魔法清掉的怪的 剩余 血量和对该怪使用魔法时魔法能影响到的范围,这里只需开一个总体变量,在每次入队和出队时进行操作就行。(因此队列要双端)
然后呢,我考试时的核心代码是这样的:
这里需要注意,我的想法是直接把每个怪的血量减去当前积累的魔法,如果剩余的血量还高于0,则将其累计答案并入队。然后我就直接一个真,忘记了负数也是真的,最后只拿到30分。(不过我考完拿dalao的代码拍的时候跑了1000多组都没跑出来......)
题解是个差分,当初想到差分了,但是没想到怎么用,题解好像是差分之后二分,也是非常套路的
这是一道atcoder原题,是ABC164E
我一开始就想到了用一个图上dp,因为t,c,d都非常大,只有x特别小,就设了f[i][j]表示到第i个点所剩金币数还有j时所需的最小时间,不过最后没有调出来,我也不能保证该算法的正确性(不过多半是对的吧.……)
正解是一个两维的最短路(可能这么叫),dis[i][j]表示到第i个点所剩j金币时的最小时间,其实跟当初我设的一样,那上面的算法应该是正确了的吧……
然后直接跑dij,不是很难,关于花钱兑硬币就建所需金币为负的自环即可
不过那个n*50坑了我半天,我一直写的10000,本地测的没事,一到Linux上就爆炸,搞了我半天
n*50表示n个点,50是最大的边权,也就是说极限情况路径长也只有n*50
T3今天更不出了,一个dp,先咕着吧
原文:https://www.cnblogs.com/ckn1023/p/13215699.html