2020.7.6比赛总结

题目链接
感受:感觉最后把思路全想一遍能发现自己不少思维上的漏洞,比赛的时候想的确实没那么多,结束之后才能整理思路。争取以后在比赛就能想好思路把。
语言方面:对于英语阅读。对于我这个用日语高考的人来说确实还是一座大山。学了几个月英语词汇量着实跟不上那些学了三年英语的。必须要抽时间系统地学一遍英语,有了学日语的经验英语学起来也确实比没有语言基础快不少,因为可以少走许多弯路,就尽快学吧!尽量不拖后腿!

反思:想了想自己为什么只能做三道题,首先有一些题目的思路确实没见过,就像那道图论题。还有自己思维上存在很大的漏洞,就像那个dp题,最后没有AC。可能一开始就觉得自己做不出来把。有点”自暴自弃“的意味了。

A题

题目大意:给你两个括号字符串,要求构造一个新字符串,这个新字符串的括号序列要合法,并且子序列中还要包含给出的两个字符串。
待补。。

B题

题目大意:给你一个长为n的数组,最多去掉其中一个元素,找出其中最长的连续递增子串。
思路:dp。
因为最多去掉一个元素,所以只有两种情况,要么去掉一个元素,要么不去元素。所以可以先求出不去掉任何元素的最长递增子串长度来,用L[i]表示以i开头的最长递增子串,R[i]表示以i结尾的最长递增子串,在求解过程中对答案更新。最后求出去掉一个元素的最长递增子串。
因为去掉第一个元素和去掉最后一个元素相当于上面以2开头的和以n-1结尾的情况,所以直接从2到n-1枚举去掉的元素。比如去掉第i+1个元素,那么最长递增子串就可以表示为:以i结尾的子串和以i+2开头的子串连接起来的长度。

在比赛中想成了子序列,到最后五分钟才意识到自己出错了,很遗憾。。。

C题

题目大意:给你三个数a,b,c。可以对每个数执行加一或减一操作,也可以不进行任何操作。要求执行完所有操作后,|a-b|+|a-c|+|b-c|的值最小。
思路:很水的数学题。。稍微写写就行了,尽量情况想的全面一点,避免不必要的WA。

D题

题目大意:给你一个长度为n的数组a。每次可以对i点执行两种操作:移动到i+a[i]或i-a[i](如果位置合法的话)。求每一个i移动到一个和a[i]奇偶性不同的位置的最少移动次数。
思路:反向建边+多源最短路+超级源点
一开始想的是对每一个点跑一次bfs,但TLE在了第八个点,后来想想每个点的路径可能和其它点的路径有重合部分,写一个记忆化搜索也行。。但bfs也能写成记忆化搜索吗。比赛后看的题解是反向建边然后求最短路。果然是个没见过的做法。。
最终思路是这样的:创建两个超级源点,一个是奇数点,一个是偶数点。这里假设n+1是奇数点,n+2是偶数点。奇数超级源点连接所有奇数点,所以从奇数超级源点到任意一个奇数点的距离是1,然后设dis[i]表示从源点到i的最短距离。因为是反向边,所以这个值就相当于从i到源点的最短距离。对于每一个奇数点,最终肯定是要让他跳到偶数点,既然不知道最终会跳到哪个点,那就直接跳到偶数超级源点,然后再从偶数超级源点跳到那个偶数点,最终结果减去偶数超级源点和偶数点之间的那个距离1。

E题

题目大意:给你两个数n和k,分别表示序列s的长度和能使用的字母数量。然后问对s的(n+1)*n/2个子序列,能够打出多少个。
思路:很顺利一眼出思路然后AC
首先用一个map来表示能用的字母,因为最多只有26个,所以这个空间很小。然后遍历序列s,遇到能用的字母就len++,遇到不能用的就加上len(len+1)/2,然后把len置为0重新找子串。这个题给出了长度为n的序列最多有n(n+1)/2个子序列,正好给了个提示。所以题目中的语言没有废话。

F题

题目大意:给你一个字符序列,字符的意义为上下左右移动。要求:从(0,0)出发,并最终能回到(0,0)。并且在途中不能经过同一个单元格两次。求最长的合法操作序列。
思路:因为少了一个特判,WA了一下。不过问题还是不大的。
首先分情况讨论:只能左右移动时,最终序列只能是LR或RL。只能上下移动时,最终序列只能是UD或DU。上下左右都可以时,因为要使序列尽可能的长,所以把所有L,R,U,D都分别扔到四个vector中,为了使得最后能回到原点,所以L的数量要等于R,U的数量要等于D,所以最后的序列长度就是取(min(L,R)+min(U,D))*2。按照一个矩形的形状顺时针或逆时针输出就行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章