Cod sursa(job #785317)

Utilizator danalex97Dan H Alexandru danalex97 Data 8 septembrie 2012 13:42:57
Problema Ghiozdan Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int Omax = 210;
const int Steps = 210;
const int O = 200;

int D[Steps][Omax];
int Init[Omax];
int Last[Omax],Nbr;
int N,G,Sum;

void Solve(int Act)
{
	int i=Act;
	for (int j=O;j;--j)
		if ( i-j >= 0 )
			if ( D[(i-j)%Steps][j] )
			{
				for (int k=0;k<=O;++k)
					D[i%Steps][k]=D[(i-j)%Steps][k];
				--D[i%Steps][j],--D[i%Steps][0];
				if ( Act<=G )
				{
					for (int k=0;k<=O;++k)
						Last[k]=D[i%Steps][k];
					Nbr=Act;
				}
				return;
			}
}

int main()
{
	freopen("ghiozdan.in","r",stdin);
	freopen("ghiozdan.out","w",stdout);
	
	scanf("%d %d\n",&N,&G);
	for (int i=1,X;i<=N;++i)
	{
		scanf("%d\n",&X);
		++D[0][X];
		++D[0][0];
		++Init[X];
		++Init[0];
		Sum= Sum < 75000 ? Sum+X : Sum;
	}
	++D[0][0];
	
	for (int i=1;i<=min(Sum,G);++i) 
		Solve(i);
	
	int Sol,Co;
	Sol=Nbr;
	Co=Init[0]-Last[0]+1;

	printf("%d %d\n",Sol,Co);
	for (int j=1;j<=O;++j) 
		for ( ; Init[j]-Last[j] ; ++Last[j] )
			printf("%d\n",j);
	
	fclose(stdin);
	fclose(stdout);
}