09/02 到 09/06 连续5场模拟赛总结

一、总体情况

  • 考试分数极其不稳定,好的时候300多分,差的时候100分
  • 没做出来的题很多都是DP和搜索,也有一些思维和数学

二、题解

Day 1

A

在这里插入图片描述

按照题意模拟即可,但要做一些优化

  • 本题的复杂度瓶颈再 a a a b b b 互质,而这种情况下,要想办法算出减去 1 1 1 的个数
  • 设个数为 x x x,可以得到: 当 ( a − b ) m o d    d = 0 ) (a-b)\mod d = 0) (ab)modd=0) 时, x = min ⁡ ( x , a m o d    d ) x=\min(x,a\mod d) x=min(x,amodd)

B

在这里插入图片描述

最小生成树模板,将边建出来后跑一边kruscal或prim就可以了

C

在这里插入图片描述
首先,可以先算出每头奶牛跑的圈数,然后 O ( n ) O(n) O(n) 算出当前的答案(不考虑小数),但这样会多算。因此,我们发现,圈数在整数一样的情况下,小数部分如果是逆序的,就会多算 1 1 1。所以,求一遍小数的逆序对,用答案减去即可

D

在这里插入图片描述
区间DP

  • 状态定义:设 f [ i ] [ j ] f[i][j] f[i][j] 表示在区间 [ i , j ] [i,j] [i,j] 中所有可以改成合法括号序列的方案中,花费最少的方案的花费
  • 状态计算: f [ i ] [ j ] = min ⁡ ( f [ i + 1 ] [ j ] + w [ i , j ] , f [ i ] [ k ] + f [ k + 1 ] [ j ] ) ( k ∈ [ i , j − 1 ] ) f[i][j]=\min(f[i+1][j]+w[i,j],f[i][k]+f[k+1][j])(k\in [i,j - 1]) f[i][j]=min(f[i+1][j]+w[i,j],f[i][k]+f[k+1][j])(k[i,j1]),其中, w [ i , j ] w[i,j] w[i,j] 表示将括号 i i i 和括号 j j j 匹配的最小花费

Day 2

A

在这里插入图片描述
暴力枚举 A A A 即可

B

在这里插入图片描述
使用DP

  • 状态定义:令 f [ i ] f[i] f[i] 表示飞到第 i i i 棵树的所有情况中,所要耗费的最小的劳累值
  • 状态计算: f [ i ] = m i n ( f [ j ] ) + 1         ( h [ j ] ≤ h [ i ] ) f[i]=min(f[j])+1\ \ \ \ \ \ \ (h[j]\le h[i]) f[i]=min(f[j])+1       (h[j]h[i])
    或 $f[i]=min(f[j])\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (h[j]>h[i])

C

在这里插入图片描述
使用并查集

  • 设在第 i i i 位时开始两个序列不一样,则之前的每个数都对应相等,可以使用并查集将这些数维护成一个集合,最终统计答案即可

D

在这里插入图片描述
看到题目首先想到前缀和

  • 若要找出一个区间 [ i , j ] [i,j] [i,j] 平均值不小于 k k k,则:
    s u m [ i ] − s u m [ j − 1 ] ≥ k ∗ ( i − j + 1 ) sum[i]-sum[j-1]\ge k*(i-j+1) sum[i]sum[j1]k(ij+1
    j j j 来替代 j − 1 j-1 j1,则:
    s u m [ i ] − s u m [ j ] ≥ k ∗ i − k ∗ j sum[i]-sum[j]\ge k*i-k*j sum[i]sum[j]kikj
    s u m [ i ] − k ∗ i > = s u m [ j ] − k ∗ j sum[i]-k*i>=sum[j]-k*j sum[i]ki>=sum[j]kj
    随后按照上面的式子计算即可

Day 3

A

在这里插入图片描述
先构造一个答案字符串 a n s ans ans,为了字典序最小,初始化成 0 0 0
接下来,先算出两个串分别和 a n s ans ans 的距离 d 1 d_1 d1 d 2 d_2 d2
再从后往前枚举答案串,让 d 1 = d 2 d_1=d_2 d1=d2 即可。

每次修改答案串上的一个值, d 1 d_1 d1 d 2 d_2 d2 要么同时加 1 1 1,要么一个加 1 1 1,一个减 1 1 1,所以,如果距离差是奇数,就直接输出 − 1 -1 1

B

在这里插入图片描述
先算出 0 0 0 1 1 1 两种奶牛数量的前缀和,然后,如果想得到答案,则:
s u m 0 [ i ] − s u m 0 [ j ] = s u m 1 [ i ] − s u m 1 [ j ] sum0[i]-sum0[j]=sum1[i]-sum1[j] sum0[i]sum0[j]=sum1[i]sum1[j]
s u m 0 [ i ] − s u m 1 [ i ] = s u m 0 [ j ] − s u m 1 [ j ] sum0[i]-sum1[i]=sum0[j]-sum1[j] sum0[i]sum1[i]=sum0[j]sum1[j]
预处理出所有的 s u m 0 [ i ] − s u m 1 [ i ] sum0[i]-sum1[i] sum0[i]sum1[i],然后求解即可

C

在这里插入图片描述
不难发现, s s s t t t 的最短路和 s m o d    n s\mod n smodn t m o d    n t\mod n tmodn 是一样的。然后用Floyd算法求解

注意要特判 s m o d    n = 0 s\mod n=0 smodn=0 t m o d    n = 0 t\mod n=0 tmodn=0

D

在这里插入图片描述
可以先枚举前两个动物,就可以递推出第三个动物,一直推下去,最后看最后的动物和开头的之间的关系符不符合题目要求

Day 4

A

在这里插入图片描述
可以先枚举第一行填的情况,之后往下递推:

  • 如果 [ i , j ] [i,j] [i,j] 的位置灯是灭的,就把 [ i + 1 ] [ j ] [i+1][j] [i+1][j] 变换一下状态,因为这样在这一排只会影响到 j j j
  • 递推到最后看最后一排能不能全部点亮就行\

B

在这里插入图片描述
枚举往左走后或往右走后的转折点,算出时间取最小就是答案

C

在这里插入图片描述
区间DP

  • 状态定义:令 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k] 表示将区间 [ i , j ] [i,j] [i,j] 分成 m m m 个区间之后的最大值/最小值
  • 状态计算:枚举是从点 k k k 开始,将区间分成 [ i , k ] [i,k] [i,k] [ k + 1 , j ] [k+1,j] [k+1,j],随后按照题目要求计算答案就可以,要用前缀和优化区间和

D

在这里插入图片描述

Day 5

A

在这里插入图片描述
使用DFS+状压DP

int dfs(int row, int column, int s, int next)
// 行、列、上一列竖着放的(二进制)、这一列竖着放的(二进制)

之所以要记录上一列和这一列竖着放的,是因为上一列竖着放的地方这一列不能放

B

在这里插入图片描述
先找到一段最长连续上升子序列(数字连续) l i s lis lis,然后可以将整个数列分为 3 3 3 种数:

  • l i s lis lis
  • l i s lis lis 的最小值要小
  • l i s lis lis 的最大值要大

其中,第二种要移动到队首,第三种要移动到队尾

答案就是 n − l e n ( l i s ) n-len(lis) nlen(lis)

C

在这里插入图片描述
D a y 2 Day2 Day2 D D D 题一模一样

D

在这里插入图片描述
按题意模拟即可,注意:一个人有可能换多次队伍

三、补题情况(2024年9月6日)

还差 D a y 2   C Day2\ C Day2 C 题、 D a y 4   C Day4\ C Day4 C 题和 D a y 5   A Day5\ A Day5 A 题未补
计划在 9 月 9 号之前补完

四、下学期学习计划

主要还是要多练一些DP和DFS的题,这几场考试很多DP和DFS的题丢分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值