Cod sursa(job #1023255)

Utilizator thewildnathNathan Wildenberg thewildnath Data 6 noiembrie 2013 18:07:21
Problema Schi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<stdio.h>

int n,e,D;
int v[52],dp[2][10002];

inline int mod(int a)
{
    return a<0?-a:a;
}
inline int min(int a,int b)
{
    return a<b?a:b;
}

int verific(int d)
{
    int i,j,k,maxi=v[n],lin,lina;
    for(i=0;i<2;++i)
        for(j=1;j<=maxi;++j)
            dp[i][j]=2000000000;

    for(j=1;j<=maxi;++j)
    {
        if(j>d)
            continue;
        dp[1][j]=mod(j-v[2]);
    }
    lin=0;lina=1;
    for(i=3;i<n;++i)
    {
        for(j=0;j<=maxi;++j)        //////////
            for(k=0;k<=d&&k<=j;++k)
                if(dp[lina][j-k]!=2000000000)           //////////
                    dp[lin][j]=min(dp[lin][j],dp[lina][j-k]+mod(j-v[i]));
        lin=1-lin;
        lina=1-lina;
    }
    for(j=maxi-d;j<=maxi;++j)
        if(dp[lina][j]<=e)
            return 1;
    return 0;
}

void caut()
{
    int st=1,dr=v[n],med,l;
    while(st<=dr)
    {
        med=(st+dr)/2;
        if(verific(med))
        {
            l=med;
            dr=med-1;
        }
        else
            st=med+1;
    }
    D=l;
}



int main()
{
    freopen("stalpi2.in","r",stdin);
    freopen("stalpi2.out","w",stdout);
    int i;
    scanf("%d%d",&n,&e);
    for(i=2;i<=n;++i)
        scanf("%d",&v[i]);

    caut();

    printf("%d\n",D);

    return 0;
}