Cod sursa(job #261314)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 18 februarie 2009 00:12:10
Problema Carnati Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<stdio.h>
#define max(a,b) (a>b?a:b)

FILE *fin=fopen("carnati.in","r"),
    *fout=fopen("carnati.out","w");

int N,C,T[2555],P[2555],A[2555],maxim;

void swap(int i,int j){
    T[i]^=T[j];T[j]^=T[i];T[i]^=T[j];
    P[i]^=P[j];P[j]^=P[i];P[i]^=P[j];
}

int main(){
    fscanf(fin,"%d %d",&N,&C);
    for(int i=1;i<=N;i++){
        fscanf(fin,"%d %d",&T[i],&P[i]);

        int j=i;
        while(j/2 && T[j/2]<T[j]){
            swap(j,j/2);
            j/=2;
        }
    }

    int Nh=N;
    while(Nh>1){
        swap(1,Nh);
        --Nh;

        int i=1,j;
        while(1){
            j=2*i;
            if(j>Nh) break;
            if(j+1<=Nh && T[j+1]>T[j]) ++j;
            if(T[j]<T[j/2]) break;
            swap(j,j/2);
            i=j;

        }
    }

    int G;


    A[0]=T[0]=-10;
    for(int i=1;i<=N;i++){
        G=P[i];
        if(G-C>0)
        for(int j=1;j<=N;j++){
            if(G<=P[j])
                A[j]=max(A[j-1]-(T[j]-T[j-1])*C+G,G-C);
            else
                A[j]=max(A[j-1]-(T[j]-T[j-1])*C,0);
            maxim=max(maxim,A[j]);
         }
        else
            maxim=max(maxim,0);

    }

    fprintf(fout,"%d\n",maxim);
    fclose(fin);
    fclose(fout);
    return 0;
}