Cod sursa(job #1724222)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 2 iulie 2016 15:55:14
Problema Zebughil Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int N=20;
const int G=(1<<20);
int v[N];

struct bloc
{
    int sum,ind;
} d[G];

bool cmp(const bloc &a, const bloc &b)
{
    return a.sum<b.sum;
}

int main()
{
    freopen("zebughil.in","r",stdin);
    freopen("zebughil.out","w",stdout);

    int n,g,i,j,x,cnt,nr,poz;
    long long s;

    for(int k=1;k<=3;k++)
    {
        cnt=0, poz=0;
        scanf("%d%d",&n,&g);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&x);
            if(x) cnt++, v[cnt]=x;
        }
        n=cnt;
        nr=(1<<n)-1;

        for(i=1;i<=nr;i++)
        {
            s=0LL;

            for(j=0;j<=20;j++)
                if((1<<j)&i)
                    s+=v[j+1];

            if(s<=1LL*g)
            {
                poz++;
                d[poz].sum=s;
                d[poz].ind=i;
            }
        }

        sort(&d[1],&d[poz+1],cmp);

        int mask=0,truck=0;

        for(i=poz;i>=1;i--)
        {
            if(mask==nr) break;
            if( !(d[i].ind & mask) )
            {
                mask|=d[i].ind;
                truck++;
            }
        }

        printf("%d\n",truck);

    }

    return 0;
}