1 solutions

  • 0
    @ 2025-4-29 17:56:05
    #include<cstdio>
    #include<cstring>
    #define MAXN 15500
    #define inf 0x3fffffff
    int a[MAXN],d[MAXN],u[MAXN],init,n,f[MAXN][70];
    int minn(int x,int y)
    {
        return x<y?x:y;
    }
    bool dp(int lim)
    {
        for(int i=0;i<=63;i++)
        {
            f[0][i]=inf;//事实上,赋值为于init也是可行的;
        }
        f[0][0]=init;
        int tmp;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>6)
            {
                for(int s=0;s<=63;s++)
                {
                    f[i][s]=inf;
                    if(f[i-1][s]<=lim)
                    {
                        f[i][s]=f[i-1][s]-d[i];
                    }
                }
            }
            else
            {
                tmp=1<<(a[i]-1);
                for(int s=0;s<=63;s++)
                {
                    f[i][s]=inf;
                    if((s>>(a[i]-1))&1)
                    {
                        if(f[i-1][s^tmp]<=lim)
                        {
                            f[i][s]=f[i-1][s^tmp]-d[i];
                        }
                    }
                    else
                    {
                        if(f[i-1][s]<=lim)
                        {
                            f[i][s]=f[i-1][s]+u[i];
                        }
                        if(f[i-1][s^tmp]<=lim)
                        {
                            f[i][s]=minn(f[i][s],f[i-1][s^tmp]+u[i]);
                        }
                    }
                }
            }
        }
        for(int s=0;s<=63;s++)
        {
            if(f[n][s]<=lim)
            {
                return true;
            }
        }
        return false;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&d[i]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&u[i]);
        }
        scanf("%d",&init);
        int L=init,R=inf,M;
        while(L<=R)
        {
            M=(L+R)>>1;
            if(dp(M))
            {
                R=M-1;
            }
            else
            {
                L=M+1;
            }
        }
        printf("%d",L);
        return 0;
    }
    
    • 1

    Information

    ID
    155
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    9
    Tags
    (None)
    # Submissions
    77
    Accepted
    5
    Uploaded By