Cod sursa(job #164740)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 24 martie 2008 19:18:29
Problema Peste Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
const int n_max = 51000;

multiset < int > s;
multiset < int >::iterator it;
pair <int , int >  v[n_max];
pair <int , int >  x[n_max];

long long d[n_max], sol;
int i, j, k, o, n, t, p, q, plase; 

inline long long maxim(long long a, long long b)
{
	if ( a > b)
		return a;
	return b;
}
int main()
{
	freopen("peste.in","r",stdin);
	freopen("peste.out","w",stdout);
	scanf("%d %d %d", &n, &plase, &t);
	for (i = 1; i <= n; ++ i)
	{
		scanf("%d %d", &x[i].second, &x[i].first);
		v[i].first = x[i].first;
	}
	sort(x+1,x+n+1);
	sort(v+1,v+n+1);
	p = 1;
	for (i = 2; i <= n; ++ i)
	{
		if (v[i].first !=v[i-1].first)
			v[++p].first = v[i].first;
	}
	k = 1;
	for (i = 1; i <= p; ++ i)
	{
		while (x[k].first <= v[i].first && k<=n)
			s.insert(x[k++].second);
		it = s.end();
		--it;
		for (q = 1; q <= plase && q <=s.size(); --it, ++q)
			v[i].second+=*it;
	}
	d[0] = 1;
	for (i = 1; i <= p; ++ i)
	{
		int tx = v[i].first, ty = v[i].second;
		for (j = 0; j <=t; ++ j)
			if (d[j] > 0 && j + tx <= t)
			{
				d[j + tx] = maxim(d[j+tx], d[j]+ty);
				if (d[j+tx] > sol)
					sol = d[j+tx];
			}
	printf("%lld\n", sol-1);
		
	return 0;
}