8.20题解
不分AB卷的题又一次使我回到了改不完题的难度,我。。。。我垃圾
T1
小凯的疑惑的结论题?
Q:我没做过,也没打表,这怎么破?
A:你题意都没倒腾明白,还打表呢,暴力都打不出来,结论个鬼啊
如果你知道这是个小凯的疑惑的结论题,或者你成功打表找出了规律的话,会发现除了17步及其以内的部分步数无法用4和7拼凑出来之外,其他的都可以,那我们可以用这个性质来优化dp,原本的dp式子是$f[i]=max(f[i-4],f[i-7])+val[i]$,运用刚才的结论,17步之内暴力转移,17步及其以上的维护前缀最大值直接得结果就可以了
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdio> 4 #define maxn 100100 5 using namespace std; 6 struct node{ 7 int val,pos; 8 }a[maxn]; 9 int n,m,qd,ans; 10 int dp[maxn],qz[maxn],b[18]={1,0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1,0}; 11 bool cmp(const node &a,const node &b) 12 { 13 return a.pos<b.pos; 14 } 15 int main() 16 { 17 scanf("%d%d",&n,&m); 18 for(int i=1;i<=n;++i) scanf("%d%d",&a[i].val,&a[i].pos); 19 a[++n].val=0; a[n].pos=0; 20 sort(a+1,a+n+1,cmp); 21 for(int i=2;i<=n;++i) 22 { 23 for(int j=i-1;j>=1;--j) 24 { 25 if(a[i].pos-a[j].pos>17) 26 { 27 dp[i]=max(dp[i],qz[j]+a[i].val); 28 qz[i]=max(qz[i-1],dp[i]); break; 29 } 30 else 31 { 32 if(b[a[i].pos-a[j].pos]) 33 { 34 dp[i]=max(dp[i],dp[j]+a[i].val); 35 qz[i]=max(qz[i],qz[i-1]+dp[i]); 36 } 37 } 38 } 39 ans=max(ans,dp[i]); 40 } 41 printf("%d\n",ans); 42 return 0; 43 }
关于那个结论,据说是什么小学奥数题,也有用exgcd证明的,可以去网上看看小凯那道题的题解,证明方法还挺五花八门的
T2
考场上把式子化简完了,觉得不可维护,就让我用化减了半天的式子打了个暴搜,得到了40分的好成绩。。。。。
先化减式子吧,$tips$:拆${\sum}$的时候,千万记得需要做的是提取公因式,合并,别给公因式乘${\sum}$遍
$(n+m-1){\times}{\sum}(({A_i-Avg})^2)$
$=(n+m-1){\times}{\sum}({A_i}^2-2{\times}A_i{\times}Avg+{Avg}^2)$
$=(n+m-1){\times}[{\sum}{A_i}^2-({\sum}A_i){\times}2{\times}Avg+({\frac{{\sum}A_i}{n+m-1}})^2]$
设$tot={\sum}{A_i}^2$ $sum={\sum}A_i$ $Avg=\frac{sum}{n+m-1}$
继续化减
原式$=(n+m-1){\times}(tot-sum{\times}2{\times}{\frac{sum}{n+m-1}}+\frac{{sum}^2}{n+m-1})$
$=(n+m-1){\times}(tot-\frac{{sum}^2}{n+m-1})$
$=(n+m-1){\times}tot-{sum}^2$
我们发现他很无聊的告诉我们每个格子中的值不超过30,为什么呢?其实是意在告诉我们$sum{\leq}1800$,是可以压进dp中去的,所以我们设$dp[i][j][k]$表示在第$i$行第$j$列,$sum=k$时$tot$的最小值,直接转移就可以了
T3
换根dp,还没整明白,鸽了