Cod sursa(job #1415791)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 6 aprilie 2015 12:17:35
Problema Carnati Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>
#include <stdlib.h>
int t[2001],p[2001],v[2001],f[2001],zz[2001];
void quicksort(int p,int u,int po[])
{
    int pivot,j,i,aux;
    if(p<u)
    {
        pivot=t[(p+u)/2];
        i=p;
        j=u;
        while(i<=j)
        {
            while(t[i]<pivot && i<u)
                i++;
            while(t[j]>pivot && j>p)
                j--;
            if(i<=j){
                aux=t[i];
                t[i]=t[j];
                t[j]=aux;
                aux=po[i];
                po[i]=po[j];
                po[j]=aux;
                i++;
                j--;
            }
        }
        if(p<j)
            quicksort(p,j,po);
        if(i<u)
            quicksort(i,u,po);
    }
}
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]);
    quicksort(1,n,p);
    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;
}