0810集训模拟总结

0810贪心

复盘

比赛前得知今天内容为贪心,结合gg温馨提示,于是在赛前确定了今天的基本战略:切题为主,辅以暴力
考试开始,在昨天的教训下,今天第一件事便是认真阅读文件相关内容,在确认了每个字的内容之后,开始阅读题目内容
首先通读全文,T1T2第一眼看起来都还好写,T3最开始看有点复杂,T4看到要维护异或和就想到维护trie树(埋下伏笔)
大约半个小时把题完完全全仔仔细细读了一遍(读题时间有点长了),开始着手较简单的T1,看到环状区间,第一感觉:将环状区间展开成为一个二倍的链状区间,t大小为100,n大小为50000,预估时间复杂度不超过O(Tn)显然是线性复杂度的题目,最大问题是如何在一遍枚举中维护所有信息
首先,当区间中所求元素数量达到最大值时,需要得出结果的最小值,并删除前面没用的元素,如果没达到最大值,则与上一次出现的位置连边,统计答案,如果是第一次出现则只标记元素第一次出现
那么需要维护什么呢
首先fst[i]存i最早出现的位置,lst[i]存上一次出现的位置,整个元素的序列考虑用链表维护,这样T1顺利解决(埋下伏笔)
这时感觉心情非常舒适
但是抬头看表,已经过去1.5h了,其中思考时间20min,写bug代码时间10min,debug时间30min,显然调试时间过长了
因为T2T3一下子想不出来,所以去看T4
对于每一位来说,只有全部翻转和全部不翻转两种选择,对于序列里的两个数来说,当且仅当 从高到低数的第0到i-1 位都相同,并且第i位不同时,两个数在第i位上是 0/1 决定这两个数是否为逆序对。因此从高到低按位划分可以计算出从高到低第i位翻转和不翻转时,由该位所决定的逆序对的个数,由上述分析可知,每一位是否翻转的选择都是独立的,对每一位直接贪心即可,再用trie树维护一下(这里和我之前想的一样
再抬头,此时已经3h了,我只剩下了1h时间看剩下两题
由于难度原因,T2我直接打上了搜索,大概率是过不了,于是看T3,显然,对于变多的硬盘按代价从小到大排序即可,但我没考虑变少,导致此题只有50分
其实本场比赛还是有战术失误的,一是读题时间太长,二是解题时间太长,这和我的代码能力不够高也有关系,这时需要提升和调整的

赛后

成绩:0+0+0+100=100
其实刚看到分的时候还是很意外的,毕竟T1本来认为能切,T3本来想拿50结果只有T4是稳拿的
为什么呢
我仔细阅读了题面,终于发现了:当已经形成连通块时不需要移动,这时minn应该输出0,但是由于要求最小值,minn初始就设为了1061109567,但是输出的时候仍然输出这个就不对了,这个问题告诉我们要认真审好题目
T3在调过之后能切掉了,但是我到现在也没找出我TLE的原因,在996上提交明明能50分
最后在看到题解之后,发现T1T4思路差不多,T3差了一半,T2我看到题解的时候很震惊,我怎么也没想到这居然是状压DP?
首先,如果有两种花的 m 值均为 1,那么显然是无法开花展的。接着,对于其它情况,关键在于分析出,最优方案中,一定是种植一种花并且用肥料续到足够的天数后,再种植下一种花。假设我们规定了从晚到早种花的顺序,并且知道使要求从晚到早的前 k 种花全部开放至少需要 d 天,那么接下来考虑第 k+1 种花——其要续到足够的天数,腾出时间使得hzwer有时间把前k种花种出来,那么很显然第k+1种花需要d/(m-1)上取整这么多天的时间来种植和施肥。我们现在的任务就是要求一个最优的顺序,这个可以使用状态压缩 DP 来完成,记 f[S]表示要种的花为集合 S 时,最少需要多少天的时间,每次枚举一种不在 S 中的花进行转移即可。

猜你喜欢

转载自blog.csdn.net/MuLaSaMe/article/details/119579775
今日推荐