Cod sursa(job #1724235)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 2 iulie 2016 16:26:12
Problema Zebughil Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 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)
{
    if(a.sum==b.sum) return a.ind<b.ind;
    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,mask,truck;
    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;
        sort(&v[1],&v[n+1]);
        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);

        mask=0,truck=0;

        for(i=poz;i>=1;i--)
        {
            if(mask==nr) break;
            if( !(d[i].ind & mask) )
            {
                mask|=d[i].ind;
                truck++;
                /*for(j=0;j<15;j++)
                    if((1<<j)&mask) printf("1");
                    else printf("0");
                printf("\n");*/
            }
        }

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

    }

    return 0;
}