Pagini recente » Cod sursa (job #2743320) | Cod sursa (job #571445) | Cod sursa (job #2228539) | Cod sursa (job #2209941) | Cod sursa (job #15137)
Cod sursa(job #15137)
#include <stdio.h>
#define MAXN 34569
int N, N2, T;
int x[MAXN], y[MAXN], d[MAXN], s[MAXN];
long long best[MAXN];
int main()
{
freopen("euro.in", "rt", stdin);
freopen("euro.out", "wt", stdout);
scanf("%d %d", &N, &T);
int i, S = 0;
s[ N2 = 0 ] = 0;
for (i = 1; i <= N; i++)
{
scanf("%d", x + i);
S += x[i]; //atata timp cat am in cont o valoare pozitiva nu voi obtine profitul maxim daca fac conversie
if (S < 0) //abia atunci cand obtin in cont o valoare negativa trebuie sa iau in considerare conversia
{ //=> comprim intervalele cu valori pozitive
y[ ++N2 ] = S;
s[ N2 ] = s[ N2 - 1 ] + S;
d[ N2 ] = i;
S = 0;
}
}
if (d[ N2 ] != N)
{
y[ ++N2 ] = S;
s[ N2 ] = s[ N2 - 1 ] + S;
d[ N2 ] = N;
}
best[0] = 0;
for (i = 1; i <= N2; i++)
{
best[i] = -(1LL << 60);
int j; long long S2 = 0;
for (j = 1; j <= i; j++)
{
S2 = (long long)d[i] * (s[i] - s[j - 1]);
if (best[j - 1] + S2 - T > best[i])
best[i] = best[j - 1] + S2 - T;
}
}
printf("%lld\n", best[ N2 ]);
return 0;
}