2021.11.6模拟赛总结

时间安排

7 : 50 − 8 : 20 7:50-8:20 7:508:20 把四道题的题面看了一遍,T1有40分的思路,T2直接自闭,T3感觉像是贪心,T4是OJ1849加多组测试。
8 : 20 − 8 : 50 8:20-8:50 8:208: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:509:30 T2直接自闭,就按照题意的描述写了一个dfs,然后第二组样例就直接T了,T得飞起。
9 : 30 − 10 : 40 9:30-10:40 9:3010: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,fi1,j+a[i].xmax(0,a[i].ykj),但是难点在于如何确定将 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,fi1,j1+a[i].xmax(0,qi1,j1.top()k(j1))),如果 f f f 可以转移,那么 q i . j = q i − 1 , j − 1 q_{i.j}=q_{i-1,j-1} qi.j=qi1,j1,然后再去掉 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:4011:20 把T4的20分用链表码了。
11 : 20 − 11 : 50 11:20-11:50 11:2011:50 在磕T2,磕得头疼,最后也没推出什么。
11 : 50 − 12 : 10 11:50-12:10 11:5012:10 检查文件名,提交。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值