Cod sursa(job #44488)

Utilizator peanutzAndrei Homorodean peanutz Data 31 martie 2007 14:40:54
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>

#define NMAX 35

long long a[NMAX];
long long b[NMAX];
long long L, N, C;
long long used[NMAX];
long long min;

void read()
{
	int i;
	scanf("%lld %lld %lld\n", &N, &C, &L);

	for(i = 0; i < N; ++i)
	{
		scanf("%lld %lld\n", &a[i], &b[i]);
	}
}

long long inline minim(long long a, long long b)
{
	if(a < b)
		return a;
	return b;
}

long long power(long long n)
{
	if(n == 1)
		return C;

	if(n == 0)
		return 1;

	long long aux = power(n / 2);

	if(n % 2)
		return aux*aux*C;

	return aux*aux;
}

void write()
{
	int i;
	printf("%lld\n", min);

	for(i = 0; i < N; ++i)
	{
		printf("%lld ", used[i]);
	}
	printf("\n");
}
int hash[NMAX];


int main()
{
	int i, j, nr, maxi, max;
	long long pow;
	freopen("shop.in", "r", stdin);
	freopen("shop.out", "w", stdout);

	read();

	//qsort(0, n-1);

	for(j = 0; j < N  && L; ++j)
	{
		for(i = max = 0; i < N && L; ++i)
		{
			if(!hash[i] && b[i] &&  a[i] >= max  &&  L >= power(a[i]))
			{
				max = a[i];
				maxi = i;
			}
		}
		i = maxi;

		pow = power(a[i]);

		nr = minim(L / pow, b[i]);

		b[i] -= nr;

		min += nr;

		used[i] = nr;

		hash[i] = 1;

		L -= pow * nr;
	}

	write();

	fclose(stdin);
	fclose(stdout);

	return 0;
}