• 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
    ",ans);
    42     return 0;
    43 }
    View Code

    关于那个结论,据说是什么小学奥数题,也有用exgcd证明的,可以去网上看看小凯那道题的题解,证明方法还挺五花八门的

    T2

    考场上把式子化简完了,觉得不可维护,就让我用化减了半天的式子打了个暴搜,得到了40分的好成绩。。。。。

    先化减式子吧,$tips$:拆${sum}$的时候,千万记得需要做的是提取公因式,合并,别给公因式乘${sum}$遍

         $(n+m-1){ imes}{sum}(({A_i-Avg})^2)$

    $=(n+m-1){ imes}{sum}({A_i}^2-2{ imes}A_i{ imes}Avg+{Avg}^2)$

    $=(n+m-1){ imes}[{sum}{A_i}^2-({sum}A_i){ imes}2{ imes}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){ imes}(tot-sum{ imes}2{ imes}{frac{sum}{n+m-1}}+frac{{sum}^2}{n+m-1})$

           $=(n+m-1){ imes}(tot-frac{{sum}^2}{n+m-1})$

           $=(n+m-1){ imes}tot-{sum}^2$

    我们发现他很无聊的告诉我们每个格子中的值不超过30,为什么呢?其实是意在告诉我们$sum{leq}1800$,是可以压进dp中去的,所以我们设$dp[i][j][k]$表示在第$i$行第$j$列,$sum=k$时$tot$的最小值,直接转移就可以了

    T3

    换根dp,还没整明白,鸽了

  • 相关阅读:
    P1182 数列分段`Section II` 二分
    洛谷 P1025 数的划分
    深浅拷贝
    数据的内置方法
    控制流程-if/while/for
    python的基本运算符
    花式赋值
    python的注释
    Python的垃圾回收机制
    变量与常量
  • 原文地址:https://www.cnblogs.com/hzjuruo/p/11396295.html
Copyright © 2020-2023  润新知