Cod sursa(job #109380)

Utilizator radamiRadu Patulescu radami Data 25 noiembrie 2007 10:37:00
Problema Aliens Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 2.3 kb
#include <stdio.h>

int sus[51],jos[51],n;
int sel[51];
int sus_fact_2_max,sus_fact_3_max,sus_fact_5_max;
int jos_fact_2_max,jos_fact_3_max,jos_fact_5_max;
int sus_fact_2[51],sus_fact_3[51],sus_fact_5[51];
int jos_fact_2[51],jos_fact_3[51],jos_fact_5[51];
int smax = 0,sol[51];

int calculeaza ()
{
	int i;
	int fact_2 = 1,fact_3 = 1,fact_5 = 1;
	for (i = 1;i <= sus_fact_2_max - jos_fact_2_max; ++i)
		fact_2 *= 2;
	for (i = 1;i <= sus_fact_3_max - jos_fact_3_max; ++i)
		fact_3 *= 3;
	for (i = 1;i <= sus_fact_5_max - jos_fact_5_max; ++i)
		fact_5 *= 5;
	if (fact_2 * fact_3 * fact_5 == 1)
		return 0;
	else 
		return fact_2 * fact_3 * fact_5;
}

void check_sum()
{
	int suma = 0;
	if (sus_fact_2_max >= jos_fact_2_max && sus_fact_3_max >= jos_fact_3_max && sus_fact_5_max >= jos_fact_5_max)
		{
			suma = calculeaza ();
			if (suma > smax)
				{
					
					smax = suma;
					int aux;
					for (aux = 1;aux <= n ;aux ++)
						sol[aux] = 0;
					for (aux = 1;aux <= n ;aux ++)
						if (sel[aux])
							sol[aux] = 1;
			}
		}
	
}

void sum_max(int k,int poz)
{
	if (k != n+1)
	{	
		check_sum();
		int l;
		for (l = poz; l <= n; l++)
			if (!sel[l])
			{
				sel[l] = 1;
				sus_fact_2_max += sus_fact_2[l];
				sus_fact_3_max += sus_fact_3[l];
				sus_fact_5_max += sus_fact_5[l];
				jos_fact_2_max += jos_fact_2[l];
				jos_fact_3_max += jos_fact_3[l];
				jos_fact_5_max += jos_fact_5[l];
				sum_max(k+1,l);
				sus_fact_2_max -= sus_fact_2[l];
				sus_fact_3_max -= sus_fact_3[l];
				sus_fact_5_max -= sus_fact_5[l];
				jos_fact_2_max -= jos_fact_2[l];
				jos_fact_3_max -= jos_fact_3[l];
				jos_fact_5_max -= jos_fact_5[l];
				sel[l] = 0;
			}
	}
}

int fact(int x,int k)
{
	int c = 0;
	while (x % k == 0 && x>0)
	{
		c++;
		x = x/k;
	}
	return c;
}
void citire()
{
	int i;
	freopen("aliens.in","r",stdin);
	scanf("%d",&n);
	for (i = 1;i <= n; ++i)
		{
			scanf("%d %d",&sus[i],&jos[i]);
			sus_fact_2[i] = fact(sus[i],2);
			sus_fact_3[i] = fact(sus[i],3);
			sus_fact_5[i] = fact(sus[i],5);
			jos_fact_2[i] = fact(jos[i],2);
			jos_fact_3[i] = fact(jos[i],3);
			jos_fact_5[i] = fact(jos[i],5);
	}
	
}

int main ()
{
	int i;
	citire();
	sum_max(1,1);
	freopen("aliens.out","w",stdout);
	printf("%d",smax);

	
	return 0;
}