Cod sursa(job #785295)

Utilizator danalex97Dan H Alexandru danalex97 Data 8 septembrie 2012 13:27:35
Problema Ghiozdan Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <cstdio>
using namespace std;

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

int D[Omax][Omax];
int Init[Omax];
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)%(O+1)][j] )
			{
				for (int k=0;k<=O;++k)
					D[i%(O+1)][k]=D[(i-j)%(O+1)][k];
				--D[i%(O+1)][j],--D[i%(O+1)][0];
				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+=X;
	}
	++D[0][0];
	
	if ( Sum<G )
	{
		printf("%d %d\n",Sum,D[0][0]-1);
		for (int j=1;j<=O;++j) 
			for ( ; D[0][j] ; --D[0][j] )
				printf("%d\n",j);
	}
	
	for (int i=1;i<=G;++i) Solve(i);
	
	int Sol,Co;for (Sol=G;D[Sol%(O+1)][0]==0;--Sol);
	Co=Init[0]-D[Sol%(O+1)][0]+1;

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