8.14模拟考总结

T1 蜗牛老师的成绩统计

首先,可以看出这道题考的是 结构体排序 ,第一关键字是 h h h,第二关键字是 m m m,最后是 s s s

考试的时候很快的就写出来了,这道题还是有点水。

T2 小蜗牛的逃离

这道题是一个 思维性强的贪心,考试时只是意味的去写模拟(这道题用模拟的话建议递归),但是超时了。

其实只用考虑几个点:

  1. 这一天是否必须采摘;
  2. 如果是,采摘后够不够吃;
  3. 如果不是,考虑采摘与不采摘哪个对后边的贡献最大

这三点只要考虑清楚了,那么这道题也就拿下了。

不过,在第三点,采摘对后边的贡献相信大家都会求,但不采摘的贡献是什么呢?

我们知道在循环到第 i i i天时,剩余的天数为 n − i n-i ni天。

如果不采摘,加等级,那么加一点等级对后边的贡献就是 n − i n-i ni点食物。

这样这道题就解决了。

T3 蜗牛老师研究基因

这道题考试的时候,读完题就看出来是个桶排,一遍过样例,之后就没管它。

结果因为数组开小了只得了 70 70 70分……

这一题其实只用把每一列分为 1 − n 1-n 1n ( 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,这里给出广搜的思路。

这个柱子上下也有周期,在这里我们想:

  1. 广搜在这道题里虽然效率也不低,但是只要数据一大就TLE;
  2. 因为这也有周期,所以我们想:
假设只有两根柱子,一根上下周期为2,另一根为3。

那么,如果你第一秒在1号柱子上,第7秒又回到1号柱子上,

那么就相当于这7秒没有动。(不理解可以手推一下)

那么,我们就可以先求出这n个数的最小公倍数lcm,

然后在算第i根柱子在lcm秒后有没有回到i。

如果回到了,就说明没动,剪枝;否则就继续BFS。
  1. 之后就按照正常的BFS来走程序就行。

这样这道题也解决了。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值