Cod sursa(job #1415770)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 6 aprilie 2015 09:49:02
Problema Carnati Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <stdlib.h>
int t[2001],p[2001],v[2001],f[2001],zz[2001];
int functie(int i,int j)
{
    int m,max=0,sum=0;
    for(m=j; m>=i; m--)
        if(p[m]>=p[j])
            sum+=p[j];
    if(sum>zz[j-1]+f[j-1]*(p[j]>=f[j-1])){
        max=sum;
        f[j]=p[j];
    }
    else
    {
        max=zz[j-1]+f[j-1]*(p[j]>=f[j-1]);
        f[j]=f[j-1];
    }
    return max;
}
int main()
{
    int i,n,max,z,c;
    freopen("carnati.in","r",stdin);
    freopen("carnati.out","w",stdout);
    scanf("%d%d",&n,&c);
    for(i=1; i<=n; i++)
        scanf("%d%d",&t[i],&p[i]);
    max=p[1]-c;
    v[1]=1;
    f[1]=p[1];
    zz[1]=p[1];
    for(i=2; i<=n; i++)
    {
        z=functie(v[i-1],i);
        if(p[i]-c<=z-c*(t[i]-t[v[i-1]]+1)){
            v[i]=v[i-1];
            zz[i]=z;
            if(z-c*(t[i]-t[v[i-1]]+1)>max)
                max=z-c*(t[i]-t[v[i-1]]+1);
        }
        else
        {
            v[i]=i;
            f[i]=p[i];
            if(p[i]-c>max)
                max=p[i]-c;
        }
    }
    printf("%d\n",max);

    return 0;
}