首先第一题是个很明显的水题切掉了,第二题发现都是1,于是就输出了1,竟然有50!第三题打了贪心40,总分190
T1 婚礼上的小杉
排序题,略掉吧。。。
话说我是本题唯一一个
O
(
n
)
O(n)
O(n)过的
T2 玩诈欺的小杉
给定变化规则,求最终矩阵
这是经典搜索题的变例,操作的方式是影响到前后两行,前后一列,由于经典的方法——枚举第一行的状态会导致解法不唯一(不能确定其他行的状态),于是我们考虑枚举第一列的状态。
枚举第一列的操作状态以后,根据前一列的操作与目标棋盘该列的状态确定下一列的操作(这里我们必须使用位运算,否则面对
20
×
20
20\times 20
20×20的数据肯定超时),最后确定最后一列操作后的状态是否符合目标,若符合则为一个解法。这里有一个小技巧,不断推出每一列的操作状态,若第
M
+
1
M+1
M+1列(实际不存在该列)的操作为不进行任何操作,那么这确定为一个解法
代码略
T3 拼拼图的小杉
d
p
dp
dp练习题
由于拼图放进集合必须是有顺序的,于是这个问题满足了无后效性,这告诉了我们应该要DP,至于怎么DP,其实有很多方式,下面是我的一种方式。
令c[i,j]=(a,b)表示前i个拼图选出j个最少要用a+1个集合,最后一个集合已经放了b个拼图块才能放得下。
c
[
i
,
j
]
=
m
i
n
{
c
[
i
−
1
,
j
]
,
c
[
i
−
1
,
j
−
1
]
+
a
[
i
]
}
c[i,j]=min\{c[i-1,j],c[i-1,j-1]+a[i]\}
c[i,j]=min{c[i−1,j],c[i−1,j−1]+a[i]}
其中
c
[
i
−
1
,
j
−
1
]
+
a
[
i
]
=
(
c
[
i
−
1
,
j
−
1
]
.
a
,
c
[
i
−
1
,
j
−
1
]
.
b
+
a
[
i
]
)
c[i-1,j-1]+a[i]=(c[i-1,j-1].a , c[i-1,j-1].b+a[i])
c[i−1,j−1]+a[i]=(c[i−1,j−1].a,c[i−1,j−1].b+a[i])当
(
c
[
i
−
1
,
j
−
1
]
.
b
+
a
[
i
]
<
=
T
)
(c[i-1,j-1].b+a[i]<=T)
(c[i−1,j−1].b+a[i]<=T)时
否则
(
c
[
i
−
1
,
j
−
1
]
.
a
+
1
,
a
[
i
]
)
(c[i-1,j-1].a+1 , a[i])
(c[i−1,j−1].a+1,a[i])当
(
c
[
i
−
1
,
j
−
1
]
.
b
+
a
[
i
]
>
T
)
(c[i-1,j-1].b+a[i]> T)
(c[i−1,j−1].b+a[i]>T)
最后
A
n
s
=
m
a
x
{
i
∣
c
[
n
,
i
]
<
M
}
Ans=max\{i|c[n,i]<M\}
Ans=max{i∣c[n,i]<M}
O ( n 2 ) O(n^2) O(n2)
T4 想越狱的小杉
也就是对每个点,找一条原点出发的路径,使其最小边最大。
用类似最短路的算法,只在判断更优的时候稍微改变判定方式,就能得到解。
O ( n 2 ) O(n^2) O(n2)