Cod sursa(job #4321)

Utilizator MariusMarius Stroe Marius Data 2 ianuarie 2007 16:20:26
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
using namespace std;

const char iname[] = "euro.in";
const char oname[] = "euro.out";
const int  MaxN = 34568;

#define infinity 1e18
int n, T;
int A[MaxN];
int P[MaxN], size;
long long B[MaxN];
long long M[MaxN];


int main(void)
{
	freopen(iname, "r", stdin);
	freopen(oname, "w", stdout);
	int i, j;
	long long sum;

	scanf("%d %d\n", &n, &T);
	for (i = 1; i <= n; ++i)
		scanf("%d ", A+i);
	for (i = 1; i <= n; i = j) {
		sum = 0;
		for (j = i; sum >= 0 && j <= n; ++j)
			 sum += (long long)A[j];
		++size;
		B[size] = sum;
		P[size] = j-1;
	}
	P[size] = n;
	for (i = 1; i <= size; ++i) {
		M[i] = -infinity;
		sum = 0;
		for (j = i; j >= 1 && i-j <= 200; --j) {
			sum += B[j];
			if (M[i] < (long long)(M[j-1] + sum * P[i] - T))
				M[i] = (long long)(M[j-1] + sum * P[i] - T);
		}
	}
	printf("%lld\n", M[size]);

	return 0;
}