Cod sursa(job #326249)

Utilizator savimSerban Andrei Stan savim Data 24 iunie 2009 13:35:27
Problema Carnati Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define ll long long
#define MAX_N 2048
#define inf 2147000000

ll n, m, c, i, j, sol = -inf;
ll V[2 * MAX_N];

struct customer {
	ll t;
	ll pret;
} A[MAX_N];


void cit() {
	freopen("carnati.in", "r", stdin);
	freopen("carnati.out", "w", stdout);

	scanf("%lld %lld", &n, &c);
	for (i = 1; i <= n; i++)
		scanf("%lld %lld", &A[i].t, &A[i].pret);
}

inline int cmp(customer P, customer Q) {
	return P.t < Q.t;
}

void solve() {
    sort(A + 1, A + n + 1, cmp);
	
	for (i = 1; i <= n; i++) {
		//fixez pretul carnatilor A[i].pret
		m = 0;
		for (j = 1; j <= n; j++) {
			m++;
			if (A[j].pret >= A[i].pret)	V[m] = A[i].pret - c;
			else V[m] = -c;

			if (j < n && A[j + 1].t != A[j].t)
				V[++m] = -(A[j + 1].t - A[j].t - 1) * c;
		}                
	
    	//subsecventa de suma maxima, vad cat obtin
    	ll sum = 0;
		for (j = 1; j <= m; j++) {
			sum = sum + V[j];
			if (sum > sol) sol = sum;

			if (sum < 0) sum = 0;
		}
	}
	
	printf("%lld\n", sol);	
}

int main() {

	cit();
	solve();

	return 0;
}