Cod sursa(job #322441)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 8 iunie 2009 20:26:38
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
//Perticas Catalin
//Working time:
//sursa x puncte
#include<stdio.h>
#include<string.h>
#include<math.h>

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

#define nm 40000
#define ll long long
#define inf 4000000000000LL
#define max(a,b)((a)>(b)?(a):(b))

int b[nm],p[nm],n,t,np;
ll c[nm],sum[nm];
inline ll sij(int i,int j)
{
  return sum[j]-sum[i-1];
}
int main()
{
    int i,j,ib;
    ll suma=0,best,ansc;
    fscanf(fin,"%d%d",&n,&t);
    np=1;
    p[1]=0;
    ib=3*sqrt(t);
    for(i=1;i<=n;i++)
    {
      fscanf(fin,"%d",&b[i]);
      suma+=b[i];
      sum[i]=sum[i-1]+b[i];
      if(suma<0)
      {
        p[++np]=i;
        suma=0;
      }
    }
    if(p[np]!=n)
      p[++np]=n;
    for(i=2;i<=np;i++)
    {
      best=-inf;
      for(j=max(1,i-ib);j<i;j++)
      {
        ansc=c[j]+sij(p[j]+1,p[i])*(ll)p[i]-(ll)t;
        best=max(best,ansc);
      }
      c[i]=best;
    }
    fprintf(fout,"%lld",c[np]);
    fclose(fin);
    fclose(fout);
    return 0;
}