Cod sursa(job #388921)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 31 ianuarie 2010 13:44:07
Problema Zebughil Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<cstdio>
#include<bitset>
using namespace std;
#define N 6
#define M 1<<N
#define maxx(a,b) ((a<b)?(b):(a))
bitset<N> biti[M],aux;
int ramas[M],v[N],g,gasit[M][N];
short int k[M][N],n,camion[M],nr[M];
int caut(int x,int y)
{
	int i=0;
	while (biti[x][i]==biti[y][i])
		++i;
	return i;
}
void calc(int z)
{
	for (int i=1; i<=k[z][0]; ++i)
		ramas[z]=maxx(ramas[z],ramas[1<<k[z][i]]);
}
void calculez_ramas(int z,int gasit1,int num)
{
	for (int i=1; i<=k[gasit1][0]; ++i)
	{
		if (ramas[1<<k[gasit1][i]]-v[num]>=0)
			ramas[z]=maxx(ramas[z],ramas[1<<k[gasit1][i]]-v[num]);
		else
			continue;
		for (int j=1; j<=k[gasit1][0]; ++j)
			if(i!=j)
				ramas[z]=maxx(ramas[z],ramas[1<<k[gasit1][j]]);
	}
}
void dinamica()
{
	int h1=1<<n;
	int aux,num;
	for (int i=1; i!=h1; ++i)
	{
		if (nr[i]==1)
		{
			camion[i]=1;
			ramas[i]=g-v[k[i][1]];
			continue;
		}
		camion[i]=19;
		ramas[i]=0;
		for (int h=1; h<=gasit[i][0]; ++h)
		{
			num=caut(i,gasit[i][h]);//pozitia bitului care difera
			aux=camion[gasit[i][h]]+(ramas[gasit[i][h]]<v[num]);
			if (camion[i]>aux)
			{
				camion[i]=aux;
				ramas[i]=0;
				if (ramas[gasit[i][h]]<v[num])
					calc(i);
				else
					calculez_ramas(i,gasit[i][h],num);
			}
			else
				if (camion[i]==aux)
					/*if (ramas[gasit[i][h]]<v[num])
						calc(i);
					else*/
						calculez_ramas(i,gasit[i][h],num);
		}
	}
}
void citire()
{
	freopen("zebughil.in","r",stdin);
	freopen("zebughil.out","w",stdout);
	for (int j=0; j!=3; ++j)
	{
		scanf("%hd%d",&n,&g);
		for (int i=0; i!=n; ++i)
			scanf("%d",&v[n-i-1]);
		dinamica();
		printf("%hd\n",camion[(1<<n)-1]);
	}
}
void desc(int x,int n)
{
	int num=0;
	while (x)
	{
		biti[n][num]=x&1;
		if (biti[n][num])
		{
			++nr[n];
			k[n][++k[n][0]]=num;
		}
		++num;
		x>>=1;
	}
}
void comp(int x)
{
	int i=0;
	aux=biti[x];
	for (;gasit[x][0]!=nr[x];)
	{
		while (!aux[i])
			++i;
		aux[i]=0;
		gasit[x][++gasit[x][0]]=aux.to_ulong();
		aux[i]=1;
		++i;
	}
}
void init()
{
	int h=1<<N;
	for (int i=1; i!=h; ++i)
	{
		desc(i,i);
		if (nr[i]-1)
			comp(i);
	}
}
int main()
{
	init();
	citire();
	return 0;
}