Pagini recente » oni2011_9_1 | Cod sursa (job #3293223) | Cod sursa (job #1583685) | Cod sursa (job #2022742) | Cod sursa (job #388921)
Cod sursa(job #388921)
#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;
}