时间安排
7
:
50
−
8
:
20
7:50-8:20
7:50−8:20 把四道题的题面看了一遍,T1有40分的思路,T2直接自闭,T3感觉像是贪心,T4是OJ1849加多组测试。
8
:
20
−
8
:
50
8:20-8:50
8:20−8:50 把T1的40分暴力码了,就是开一个维护一个堆顶为当前可到节点的血量最小的节点的堆,再用一个变量now表示当前的最大攻击力,如果now小于堆顶的血量,就让ans等于堆顶的血量,对于每个节点都这样做一遍,时间复杂度
O
(
n
2
l
o
g
n
)
O(n^2log\,n)
O(n2logn)。
8
:
50
−
9
:
30
8:50-9:30
8:50−9:30 T2直接自闭,就按照题意的描述写了一个dfs,然后第二组样例就直接T了,T得飞起。
9
:
30
−
10
:
40
9:30-10:40
9:30−10:40 对于T3,我最开始的想法是贪心,考虑m个数中只有前
m
i
n
(
n
,
m
)
min(n,m)
min(n,m) 大的数是有意义的,因为如果你不取最大显然不优,然后可以发现基础税值(设为
x
x
x )最大的一定要和最大的数在最后撤换,所以就每一位每一位比较,如果大于当前的忠诚度(设为
y
y
y ),就直接替换,显然是错的,而且不好维护下降的
k
k
k,所以我就又设了一个变量来维护
k
k
k,然后不难发现如果把封地按
x
x
x 从大到小排序,那么对于第
i
i
i 个数字
v
i
v_i
vi,它的忠诚度为前面的撤换的次数
×
k
\times k
×k,这样就可以从前向后递推,所以就设
f
i
,
j
f_{i,j}
fi,j 表示前
i
i
i 个数,撤换了
j
j
j 次的最大的税值,对于不撤换
j
j
j,显然
f
i
,
j
=
m
a
x
(
f
i
,
j
,
f
i
−
1
,
j
+
a
[
i
]
.
x
∗
m
a
x
(
0
,
a
[
i
]
.
y
−
k
∗
j
)
f_{i,j}=max(f_{i,j},f_{i-1,j}+a[i].x*max(0,a[i].y-k*j)
fi,j=max(fi,j,fi−1,j+a[i].x∗max(0,a[i].y−k∗j),但是难点在于如何确定将
j
j
j 替换为什么值,也是贪心的思想,一定是当前还未被使用过的最大的值,所以我又开了
n
2
n^2
n2 个堆(
q
q
q )随着
f
f
f 转移,
q
i
,
j
q_{i,j}
qi,j 的堆顶为前
i
i
i 数中撤换
j
j
j 个后的最大值,则
f
i
,
j
=
m
a
x
(
f
i
,
j
,
f
i
−
1
,
j
−
1
+
a
[
i
]
.
x
∗
m
a
x
(
0
,
q
i
−
1
,
j
−
1
.
t
o
p
(
)
−
k
∗
(
j
−
1
)
)
)
f_{i,j}=max(f_{i,j},f_{i-1,j-1}+a[i].x*max(0,q_{i-1,j-1}.top()-k*(j-1)))
fi,j=max(fi,j,fi−1,j−1+a[i].x∗max(0,qi−1,j−1.top()−k∗(j−1))),如果
f
f
f 可以转移,那么
q
i
.
j
=
q
i
−
1
,
j
−
1
q_{i.j}=q_{i-1,j-1}
qi.j=qi−1,j−1,然后再去掉
q
i
,
j
q_{i,j}
qi,j 的堆顶,最后答案就是
m
a
x
(
f
n
,
i
,
i
∈
[
0
,
n
]
)
max(f_{n,i},i \in [0,n])
max(fn,i,i∈[0,n])。
10
:
40
−
11
:
20
10:40-11:20
10:40−11:20 把T4的20分用链表码了。
11
:
20
−
11
:
50
11:20-11:50
11:20−11:50 在磕T2,磕得头疼,最后也没推出什么。
11
:
50
−
12
:
10
11:50-12:10
11:50−12:10 检查文件名,提交。