Pagini recente » Cod sursa (job #597960) | Cod sursa (job #146848) | Cod sursa (job #2740990) | Cod sursa (job #333888) | Cod sursa (job #388883)
Cod sursa(job #388883)
#include<cstdio>
#include<bitset>
using namespace std;
#define N 18
#define M 1<<18
#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][18],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 calculez_ramas(int z,int x,int num)
{
for (int i=1; i<=k[x][0]; ++i)
ramas[z]=maxx(ramas[x],ramas[k[x][i]]-v[num]);
}
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]);
aux=camion[gasit[i][h]]+(ramas[gasit[i][h]]<v[num]);
if (camion[i]>aux)
{
camion[i]=aux;
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[n]);
}
}
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<<18;
for (int i=1; i!=h; ++i)
{
desc(i,i);
if (nr[i]-1)
comp(i);
}
}
int main()
{
init();
citire();
return 0;
}