Cod sursa(job #137342)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 17 februarie 2008 11:21:51
Problema Carnati Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.6 kb
#include <stdio.h>

struct ggg
{
   int t,p;
};
typedef struct ggg pozis;
pozis a[2010];

int N,nr;
long max;
long S,k,suma[2010],K;

void citire()
{
  freopen ("carnati.in","r",stdin);
  scanf("%d%d",&N,&K);
  int q,w;
     for (int i=0;i<N;i++)
     {
	scanf("%d%d",&q,&w);
	if (q>max)
	   max=q;
	suma[q]+=w;
     }
  fclose(stdout);
}

/*void poz(int li,int ls,int &k,ggg a[2010])
{
   int i=li,j=ls,i1=0,j1=-1,aux;
   ggg c;
   while (i<j)
   {
      if (a[i].t>a[j].t)
      {
	 c=a[j];
	 a[j]=a[i];
	 a[i]=c;
	 aux=i1;
	 i1=-j1;
	 j1=-aux;
      }
      i=i+i1;
      j=j+j1;
   }
   k=i;
}

void quick(int li,int ls)
{
  if (li<ls)
  {
     poz(li,ls,k,a);
     quick (li,k-1);
     quick (k+1,ls);
  }
}*/

int maxi (int a,int b)
{
   if (a>b)
      return a;
   return b;
}

void maxim ()
{
   int i=0;
   long S1,poz;
      while (suma[i]==0)
	 i++;
      poz=i;
   a[0].t=i;
   a[0].p=suma[i];
   nr=1;
   for (i=poz+1;i<=max;i++)
     if (suma[i]!=0)
     {
	a[nr].t=i;
	a[nr].p=suma[i];
	nr++;
     }
}

void aflare()
{
  int i,j,y,r;
  max=0;
    for (i=0;i<nr;i++)
      for (j=0;j<nr-1;j++)
	for (y=j+1;y<nr;y++)
	{
	   int nr1=0,inc=-1,sf=-1;
	  for (r=j;r<y;r++)
	    if (a[r].p>=a[i].p)
	    {
	       nr1++;

	       sf=r;
	       if (inc==-1)
		 inc=r;
	    }
	  if (sf!=-1)
	  {
	    max=maxi(max,nr1*a[i].p-(a[sf].t-a[inc].t+1)*K);
	  }
	}
   freopen ("carnati.out","w",stdout);
   printf("%ld\n",max);
   fclose(stdout);
}

int main ()
{
   citire();
   maxim();
   aflare();
   return 0;

}