2021-08-14 模拟考试
T1 蜗牛老师的成绩统计
首先,可以看出这道题考的是 结构体排序 ,第一关键字是 h h h,第二关键字是 m m m,最后是 s s s。
考试的时候很快的就写出来了,这道题还是有点水。
T2 小蜗牛的逃离
这道题是一个 思维性强的贪心,考试时只是意味的去写模拟(这道题用模拟的话建议递归),但是超时了。
其实只用考虑几个点:
- 这一天是否必须采摘;
- 如果是,采摘后够不够吃;
- 如果不是,考虑采摘与不采摘哪个对后边的贡献最大。
这三点只要考虑清楚了,那么这道题也就拿下了。
不过,在第三点,采摘对后边的贡献相信大家都会求,但不采摘的贡献是什么呢?
我们知道在循环到第 i i i天时,剩余的天数为 n − i n-i n−i天。
如果不采摘,加等级,那么加一点等级对后边的贡献就是 n − i n-i n−i点食物。
这样这道题就解决了。
T3 蜗牛老师研究基因
这道题考试的时候,读完题就看出来是个桶排,一遍过样例,之后就没管它。
结果因为数组开小了只得了 70 70 70分……
这一题其实只用把每一列分为 1 − n 1-n 1−n和 ( n + 1 ) − 2 n (n+1)-2n (n+1)−2n两部分,把前半部分存进桶里,后半部分判断就行。
也是到比较水的题。
T4 蜗牛老师的代码
这个题看了数据范围后当场就决定拿部分分。
其实这道题拿 50 50 50分还是很简单的,只用把前1e6个字母映射到数组上,然后调用即可。
AC策略:我们先来分析一波:
- 首先,这个字符串处理是有规律的;
- 其次,n很大,所以不能用上边说到的方法,只能想办法缩小n。
怎么做呢?让我们先来模拟一下过程:
样例:
ABC
3
7
5
12
//模拟过程:
先把字符串展开成12位:
ABCCABBABCCA
我们可以把它分成以下几部分:
ABCCA B B ABCCA
不难发现:第一部分和第四部分相等,第二部分和第三部分相等
因此,当我们拿到n时,可以先定义一个len记录字符串长度。
然后只要n>2*len,就一直让len*=2。
然后只要n>字符串长度,就继续循环。
伪代码如下:
while(chs<n)
{
long long dis=chs;
while(n>dis*2)//可以一直进行折半操作
dis*=2;
n-=(dis+1);//因为新的字符串的开头是上一个字符串的结尾,所以应减去dis+1
if(n==0) n=dis;//说明刚好是最后一个
}
因此,我们让每个n都进行一遍这个操作,直到n小于字符串长度。
这样就可以把n映射到原来字符串的位置上,最后输出即可。
T5 蜗牛老师的跳跃
这道题一开始有过搜索的思路,但是在时间仅剩半个小时的时候还没写出来,就用暴力打了20分。
正解有两种:广搜和dp,这里给出广搜的思路。
这个柱子上下也有周期,在这里我们想:
- 广搜在这道题里虽然效率也不低,但是只要数据一大就TLE;
- 因为这也有周期,所以我们想:
假设只有两根柱子,一根上下周期为2,另一根为3。
那么,如果你第一秒在1号柱子上,第7秒又回到1号柱子上,
那么就相当于这7秒没有动。(不理解可以手推一下)
那么,我们就可以先求出这n个数的最小公倍数lcm,
然后在算第i根柱子在lcm秒后有没有回到i。
如果回到了,就说明没动,剪枝;否则就继续BFS。
- 之后就按照正常的BFS来走程序就行。
这样这道题也解决了。