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{唐}\)
本文来自博客园,作者:whrwlx,转载请注明原文链接:https://www.cnblogs.com/whrwlx/p/18447019