10.3 代码源 2024 CSP-S 模拟赛 Day 8

省流:\(100+15+0+5=120\)

简称:唐诗

T1

开始想了个这:

int dp[105][N][N];
/*
dp[i][j][k]:第i轮,攻击j,增量k,最大伤害

dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-k][k]+j-k+a[i-1],dp[i-1][j-c[i-1]-k][k],dp[i-1][j-k][k-b[i-1]]);
*/

然后发现一个神奇性质:

设操作后攻击了 \(j\) 次且轮次分别为 \(p_1...p_j\)

然后二操作的贡献就是:

\[\sum^{j}_{k=1}(p_k-i) \cdot b_i=(k-i \cdot j)\cdot b_i \]

所以有以下柿子:

int f[105][105][N*10];
/*
f[i][j][k]:第i轮,操作后攻击j次,攻击所在回合数和为k时最大伤害

操作贡献:1.a[i] 2.b[i]*(k−i*j) 3.c[i]*j

f[i][j][k]=max(f[i+1][j-1][k-i]+a[i],f[i+1][j][k]+j*c[i],f[i+1][j][k]+b[i]*(k-j*i))
*/

memset(f,-10,sizeof(f));
f[n][1][n]=a[n];
bd(i,n-1,1)
{
    fd(j,0,n-i+1)//最多攻击n-i+1次
    {
        fd(k,(i+(i+j-1))*j/2,(n+(n-j+1))*j/2)//全放前和全放后
        {
            f[i][j][k]=max(f[i][j][k],f[i+1][j-1][k-i]+a[i]);//1
            f[i][j][k]=max(f[i][j][k],f[i+1][j][k]+b[i]*(k-j*i));//2
            f[i][j][k]=max(f[i][j][k],f[i+1][j][k]+j*c[i]);//3
            ans=max(ans,f[i][j][k]);
        }
    }
}

T2

写了一个 \(O(n^3)\) 的,然后赛后发现可以用前缀和优化成 \(O(n^2)\)……

然后正解是树状数组……

T3

一眼暴力,然后懒得写,去看 T4 了……

正解可以贪心。题解(%%%zzn%%%)

T4

最有思路的一集()

\(n=1\)\(5\) 分很好想,赛时一直在想 \(n=2\) 的,复杂度 \(O(c^2)\),但是交了全 WA……

正解是容斥和 and 卷积……

根本看不懂啊 QwQ

总结

  • 还是 DP/贪心 大法好

  • 尽量把暴力打满

  • 多想一下暴力的优化(根号分治、前缀和等)

\(\LARGE{唐}\)

posted @ 2024-10-04 18:14  whrwlx  阅读(19)  评论(0编辑  收藏  举报