Cod sursa(job #399152)

Utilizator toniobFMI - Barbalau Antonio toniob Data 19 februarie 2010 21:44:11
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <cstdio>

using namespace std;
const int NMax = 1 << 20;
const int FMax = 1 << 8;

int frec[FMax], a[NMax], v[NMax], N, G;

int main () {
	freopen ("ghiozdan.in", "r", stdin);
	freopen ("ghiozdan.out", "w", stdout);
	
	scanf ("%d%d", &N, &G);
	
	for (int i = 1, k; i <= N; ++i) {
		scanf ("%d", &k);
		++frec[k];
	}
	
	int x, y;
	for (int i = FMax; i >= 1; --i) {
		for (int k = G- i; k>=0;--k) {
			if (!k || v[k]) {
				for (int j = 1; j <= frec[i]; ++j) {
					x=k+i*j;
					if (!v[x] && G >= x) {
						v[x] = v[x-i]+1;
						a[x] = x-i;
					}
					else {
						break;
					}
				}
			}
		}
	}
	
	int i;
	for (i = G; i>=1;--i) {
		if (v[i]) {
			printf ("%d %d\n", i, v[i]);
			break;
		}
	}
	
	for (x=i, y=a[i];v[i];) {
		printf ("%d\n", x-y);
		--v[i];
		x = y;
		y=a[x];
	}
	
	return 0;
}