Cod sursa(job #261293)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 17 februarie 2009 23:51:58
Problema Carnati Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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[2005],P[2005],A[2005],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;

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

    }

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