Cod sursa(job #163494)

Utilizator andrei.12Andrei Parvu andrei.12 Data 22 martie 2008 13:38:46
Problema Peste Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 9-a Marime 1.18 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<algorithm>

using namespace std;

#define lg 50005

int n, k, total, i, j, sm, d[1005], maxt, x, x1, x2;
long long raspuns, rz[lg];
char sir[20];

struct ches{
	int c, t;
};
ches v[lg];
inline int cmp(ches a, ches b){
	return a.t < b.t;
}
class mmc{
	public:
		bool operator()(int a, int b){
			return a > b;
		}
};

int main()
{
	freopen("peste.in", "rt", stdin);
	freopen("peste.out", "wt", stdout);

	scanf("%d%d%d\n", &n, &k, &total);
	for (i = 1; i <= n; i ++)
		scanf("%d%d", &v[i].c, &v[i].t);

	sort(v+1, v+n+1, cmp);
	maxt = v[n].t;
	
	priority_queue<int, vector<int>, mmc> hp;

	for (i = 1; i <= k; i ++){
		sm += v[i].c;

		d[v[i].t] = sm;

		hp.push(v[i].c);
	}
	for (i = k+1; i <= n; i ++){
		x = hp.top();
		hp.pop();

		sm -= x;
		sm += v[i].c;
		d[v[i].t] = max(sm, d[v[i].t]);

		hp.push(v[i].c);
	}

	rz[0] = 1;
	for (i = 1; i <= maxt; i ++)
		if (d[i])
			for (j = 0; j <= total; j ++)
				if (rz[j]){
					if (i+j <= total)
						if (d[i] + rz[j] > rz[i+j]){
							rz[i+j] = (long long)(d[i] + rz[j]);

							
							if (rz[i+j] > raspuns)
								raspuns = rz[i+j];
						}
				}

	printf("%lld\n", raspuns-1);

	return 0;
}