1 条题解

  • 1
    @ 2022-8-31 8:21:24
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1000000+10;
    const long long inf=0x7f7f7f7f7f7f7f7f;
    typedef long long ll;
    typedef double ddf;
    typedef int _int;
    #define int ll
    int n,m;
    int l[N],g[N],f[2][N][2],pr,nt;
    int t[2],s[2][N];
    int ass;
    void fuck(){
        memset(f,0x7f,sizeof(f));
        t[1]=0;
        for(int j=1;j<=3;j++){
            for(int k=g[j]-2;k<=g[j];k++){
                if(k<=g[1])s[1][++t[1]]=k;
            }
        }
        for(int i=1;i<=t[1];i++)f[1][i][0]=f[1][i][1]=g[1]-s[1][i];
        pr=0,nt=1;
        for(int i=2;i<=n;i++){
            pr^=1,nt^=1;t[nt]=0;
            int lf=max(1ll,i-2),rf=min(n,i+2);
            for(int j=lf;j<=rf;j++){
                for(int k=g[j]-2;k<=g[j];k++){
                    if(k<=g[i])s[nt][++t[nt]]=k;
                }
            }
            for(int j=1;j<=t[nt];j++){
                f[nt][j][1]=f[nt][j][0]=inf;
                for(int k=1;k<=t[pr];k++){
                    if(s[pr][k]>s[nt][j])f[nt][j][0]=min(f[nt][j][0],f[pr][k][1]);
                    else if(s[pr][k]<s[nt][j])f[nt][j][1]=min(f[nt][j][1],f[pr][k][0]);
                    else f[nt][j][0]=min(f[nt][j][0],f[pr][k][0]),f[nt][j][1]=min(f[nt][j][1],f[pr][k][1]);
                }
                f[nt][j][0]+=g[i]-s[nt][j];
                f[nt][j][1]+=g[i]-s[nt][j];
            }
        }
        int re=inf;
        for(int i=1;i<=t[nt];i++)re=min(re,min(f[nt][i][0],f[nt][i][1]));
        ass+=re;
    }
    _int main(){
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)scanf("%lld",&g[i]);
        //fuck();
        fuck();
        printf("%lld",ass);
        return 0;
    }
    
    • 1

    信息

    ID
    1265
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    2
    已通过
    2
    上传者