Cod sursa(job #214715)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 15 octombrie 2008 18:41:35
Problema Shop Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

struct ms {
	long long x, y, poz;
};


ms a[1024];
long long n, c, l, i, aux, nmz, y[1024];

int cmp(const void *w, const void *z) {
	ms c = *(ms *)w, d = *(ms *)z;

	if (c.y != d.y) {
		return d.y - c.y;
	}
	return d.x - c.x;
}

long long min(long long num1, long long num2) {
	if (num1 < num2) {
		return num1;
	}
	return num2;
}

long long put(long long num1, long long num2) {
	long long p = 1;
	for (long long i = 1; i <= num2; ++i) {
		p *= num1;
	}
	return p;
}

int main() {
	freopen("shop.in", "r", stdin);
	freopen("shop.out", "w", stdout);
	scanf("%lld %lld %lld", &n, &c, &l);
	for (i = 1; i <= n; ++i) {
		scanf("%lld %lld", &aux, &a[i].y);
		a[i].x = put(c, aux);;
		a[i].poz = i;
	}
	qsort(a + 1, n, sizeof(a[0]), cmp);
	aux = n;
	while (l != 0 && aux > 0) {
		long pop = 0;
		while (l - a[aux].x >= 0 && pop < a[aux].y) {
			++pop;
			l -= a[aux].x;
		}
		y[a[aux].poz] = pop;
		//y[a[aux].poz] = min((l / a[aux].x), a[aux].y);
		nmz += y[a[aux].poz];
		--aux;
	}
	printf("%lld\n", nmz);
	for (i = 1; i <= n; ++i) {
		printf("%lld ", y[i]);
	}
	printf("\n");
	return 0;
}