Cod sursa(job #508031)

Utilizator cosmyoPaunel Cosmin cosmyo Data 7 decembrie 2010 14:09:53
Problema Ghiozdan Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
using namespace std;
const int G = 75001;
const int N = 20001;
const int inf = N * G;
int s[205], n, g, a[2][G], current=1, prev=0, d[G], front, back, l, r;

int main() {
	freopen("ghiozdan.in", "r", stdin);
	freopen("ghiozdan.out", "w", stdout);

	int i,j,k,x,c;

	scanf("%d %d", &n, &g);

	for(i = 1;i <= n; ++i)
		{scanf("%d", &x); ++s[x]; if(x>r) r=x;}

	for(i = 0;i <= 1; ++i)
		for(j = 0;j <= g; ++j)
			a[i][j] = inf;

	a[0][0] = a[1][0] = 0;

	for(i = 1;i <= r; ++i) 	
	if(s[i])
	{
		for(j = 0;j < i; ++j) {
			front = 1; back = 0 ;
			c=0;
			for(k = j; k <= g; k+=i) {
				
				while(a[prev][k]+k/i<=a[prev][d[back]]+d[back]/i && front<=back)
				 --back;
				++back;d[back]=k;
				if(front<=back)
					a[current][k]=a[prev][d[front]]+(k-d[front])/i;
				while(k-d[front]>=s[i]*i&&front<=back)
					++front;
			}
		}
	//	for(j=0;j<=g;++j)
	//		printf("%d ",a[current][j]);
	//	printf("\n");
	current^=1;
	prev^=1;
	}
	
	for(i=g;i>=0;--i)
		if(a[prev][i]<inf)
		{
			printf("%d %d\n",i,a[prev][i]);
			break;
		}
		 
	return 0;

}