Cod sursa(job #139238)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 19 februarie 2008 21:00:39
Problema Carnati Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
long int n,c,i,j,t[2005],p[2005],aux,pc,v,tv,cav,pv,pa,p1,p2,ps;
void hd(long int ic,long int nc);
void sh(long int i1,long int i2);
int main()
{
     FILE *f,*g;f=fopen("carnati.in","r");g=fopen("carnati.out","w");
     fscanf(f,"%ld%ld",&n,&c);
     for(i=1;i<=n;i++)fscanf(f,"%ld%ld",&t[i],&p[i]);
     for(i=n/2;i>=1;i--)hd(i,n);
     for(i=n;i>=1;i--){sh(1,i);hd(1,i-1);}
     for(i=1;i<=n;i++)
     { pc=p[i];pv=0;
       for(j=1;j<=n;j++)
       { v=0;tv=t[j-1];
	 if(p[j]>=pc)v+=pc;
	 while(t[j]==t[j+1]){j++;if(p[j]>=pc)v+=pc;}
	 cav=(t[j]-tv)*c;
	 p1=pv+v-cav;
	 p2=v-c;
	 pa=(p1>p2)?p1:p2;
	 ps=(ps>pa)?ps:pa;
	 pv=pa;
       }
     }
     fprintf(g,"%ld\n",ps);
     fcloseall();
     return 0;
}
void hd(long int ic,long int nc)
{
     long int is,is1;
     is=2*ic;is1=is+1;
     if(is>nc)return;
     if(is<nc)if(t[is1]>t[is])is=is1;
     if(t[is]>t[ic]){sh(is,ic);hd(is,nc);}
}
void sh(long int i1,long int i2)
{
     aux=t[i1];t[i1]=t[i2];t[i2]=aux;
     aux=p[i1];p[i1]=p[i2];p[i2]=aux;
}