Cod sursa(job #507806)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 6 decembrie 2010 20:41:55
Problema Ghiozdan Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
#define nmax 20010
#define gmax 75010
#define inf 100000

int n, g, l, v[nmax], f[210], d[2][gmax], q[gmax], p[gmax];

int main()
{
	freopen("ghiozdan.in","r",stdin);
	freopen("ghiozdan.out","w",stdout);
	scanf("%d %d",&n,&g);
	int i, j, r, st, dr, x, c, idx, pr, k, y;
	for (i=1; i<=n; i++) 
	{
		scanf("%d",&v[i]);
		if (v[i]>l) l=v[i];
		f[v[i]]++;
	}
	for (i=1; i<=g; i++) d[0][i]=inf;
	idx=0;
	for (i=1; i<=l; i++)
	{
		if (f[i])
		{
			pr=idx;
			idx=!idx;
			for (j=0; j<i; j++)
			{
				st=1;
				dr=0;
				for (k=j; k<=g; k+=i)
				{
					while (st<=dr && p[st]<k-f[i]*i) st++;
					while (dr>=st && d[pr][k]-(k/i)<=q[dr]) dr--;
					q[++dr]=d[pr][k]-(k/i);
					p[dr]=k;
					if (st<=dr)
						d[idx][k]=d[pr][p[st]]+(k-p[st])/i;
				}
			}
		}
	}
	for (i=g; i>=0 && d[idx][i]>=inf; i--);
	printf("%d %d\n",i,d[idx][i]);
}