Cod sursa(job #785306)

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

const int Omax = 210;
const int Steps = 201;
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],
					Last[k]=D[(i-j)%Steps][k];
				--D[i%Steps][j],--D[i%Steps][0];
				--Last[j],--Last[0];
				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+=X;
	}
	++D[0][0];
	
	for (int i=1;i<=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);
}