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 }
View Code

关于那个结论,据说是什么小学奥数题,也有用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,还没整明白,鸽了

posted @ 2019-08-22 19:21  hzoi_X&R  阅读(126)  评论(0编辑  收藏  举报