Cod sursa(job #645117)

Utilizator katakunaCazacu Alexandru katakuna Data 8 decembrie 2011 16:23:55
Problema Ghiozdan Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;

#define GMAX 210
#define CMAX 75010
#define INF 0x3f3f3f3f

int N, C, Gmax;
int F[GMAX];

void dinamica () {
	
	int i, j, l;
    int A[CMAX], B[CMAX];
	int left, right, Deque[CMAX];
	
	memset (A, INF, sizeof (A));
    memset (B, INF, sizeof (B));
    
	A[0] = 0; B[0] = 0;
	for (i = 1; i <= Gmax; i++) {

		for (l = i; l < (i << 1); l++) {
			left = 1; right = 1;
			Deque[1] = l - i;
			for (j = l; j <= C; j+= i) {
				
				while (left <= right && Deque[left] < j - F[i] * i) left++;
				
				if (left <= right) B[j] = min(B[j], A[ Deque[left] ] + (j - Deque[left]) / i);

				while (left <= right && (A[ Deque[right] ] + (j - Deque[right]) / i) > A[j]) right--;
				
				Deque[++right] = j;
			}
		}

		memcpy (A, B, sizeof (A));
	}

	for (i = C; i >= 1; i--) 
		if (A[i] != INF) { 
			printf ("%d %d\n", i, A[i]);
			return ;
		}
}

void citire () {
	
	int i, g;
	scanf ("%d %d", &N, &C);
	for (i = 1; i <= N; i++) {
		scanf ("%d", &g);
		F[g]++;
		Gmax = max (Gmax, g);
	}
}


int main () {

	freopen ("ghiozdan.in", "r", stdin);
	freopen ("ghiozdan.out", "w", stdout);
	
	citire ();
	dinamica ();

	return 0;
}