Cod sursa(job #326272)

Utilizator savimSerban Andrei Stan savim Data 24 iunie 2009 14:07:17
Problema Carnati Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_N 2048
#define inf 2147000000

int n, m, c, sol = -inf;
struct customer {
	int t;
	int c;
} V[MAX_N];
int A[MAX_N];

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

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

	scanf("%d %d", &n, &c);
	for (int i = 1; i <= n; i++)
		scanf("%d %d", &V[i].t, &V[i].c);

	sort(V + 1, V + n + 1, cmp);
}

void ssm() {
	int sum = 0;
	for (int i = 1; i <= m; i++) {
		sum += A[i];
		if (sum > sol) sol = sum;

    	if (sum < 0) sum = 0;
	}
}

void solve() {
	//fixez pretul carnatilor pe rand pretul fiecarui carnat
	for (int i = 1; i <= n; i++) { //carnatii vor avea pretul V[i].c
		m = 0;

		int j = 1;
		while (j <= n) {
			int k = j;

			A[++m] = -c;
			if (V[j].c >= V[i].c) A[m] += V[i].c;

			while (V[k].t == V[k + 1].t && k < n) {
				k++;
				if (V[k].c >= V[i].c) A[m] += V[i].c;
			}

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

			j = k + 1;
		}

		ssm();
	}	

	printf("%d\n", sol);
}

int main() {

	cit();
	solve();

	return 0;
}