Cod sursa(job #1561887)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 4 ianuarie 2016 17:29:40
Problema Carnati Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#define MAXN 2001
int timp[MAXN],cost[MAXN],profit[MAXN],poz[MAXN],pret[MAXN];
inline void swap(int b,int e,int *v){
    int aux=v[b];
    v[b]=v[e];
    v[e]=aux;
}
void myqsort(int begin,int end){
    int b=begin,e=end,pivot=timp[(b+e)/2];
    while(b<=e){
        while(timp[b]<pivot) b++;
        while(timp[e]>pivot) e--;
        if(b<=e){
            swap(b,e,timp);
            swap(b,e,cost);
            b++;e--;
        }
    }
    if(begin<e) myqsort(begin,e);
    if(b<end) myqsort(b,end);
}
int main(){
    FILE*fi,*fout;
    int i,j,n,m,max,pmax,con,nr,c;
    fi=fopen("carnati.in" ,"r");
    fout=fopen("carnati.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&c);
    for(i=1;i<=n;i++)
        fscanf(fi,"%d%d" ,&timp[i],&cost[i]);
    myqsort(1,n);
    pmax=0;
    for(i=1;i<=n;i++){
        j=i;
        con=max=0;
        while(j>0){
            if(cost[j]>=cost[i])
                con++;
            if(con*cost[i]-(timp[i]-timp[j]+1)*c>max)
                max=con*cost[i]-(timp[i]-timp[j]+1)*c;
            j--;
        }
        nr=profit[i-1]-c*(timp[i]-timp[i-1]);
        if(pret[i-1]<=cost[i])
            nr+=pret[i-1];
        if(max<nr){
            pret[i]=pret[i-1];
            profit[i]=nr;
        }
        else{
            profit[i]=max;
            pret[i]=cost[i];
        }
        if(pmax<profit[i])
            pmax=profit[i];
    }
    fprintf(fout,"%d" ,pmax);
    fclose(fi);
    fclose(fout);
    return 0;
}