一、总体情况
- 考试分数极其不稳定,好的时候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) (a−b)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,j−1]),其中, 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[j−1]≥k∗(i−j+1)
用 j j j 来替代 j − 1 j-1 j−1,则:
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]≥k∗i−k∗j
s u m [ i ] − k ∗ i > = s u m [ j ] − k ∗ j sum[i]-k*i>=sum[j]-k*j sum[i]−k∗i>=sum[j]−k∗j
随后按照上面的式子计算即可
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) n−len(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的题丢分