Cod sursa(job #326262)

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

using namespace std;

#define MAX_N 2048
#define inf 2147000000

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

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


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

	scanf("%d %d", &n, &c);
	for (i = 1; i <= n; i++)
		scanf("%d %d", &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;

		j = 1;
		while (j <= n) {
			V[++m] = -c;
			if (A[j].pret >= A[i].pret) V[m] += A[i].pret;

			int ind = j;
			while (A[ind].t == A[ind + 1].t && ind <= n) {
				ind++;
				if (A[ind].pret >= A[i].pret) V[m] += A[i].pret;
			}

			if (j < n && A[j + 1].t != A[j].t)
				V[++m] = -(A[j + 1].t - A[j].t - 1) * c;

			j++;
		}                
	
    	//subsecventa de suma maxima, vad cat obtin
    	int sum = 0;
		for (j = 1; j <= m; j++) {
			sum = sum + V[j];
			if (sum > sol) sol = sum;

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

int main() {

	cit();
	solve();

	return 0;
}