Cod sursa(job #1045731)

Utilizator PatrunjelFMIAnita Liviu Patrunjel Data 1 decembrie 2013 22:23:53
Problema Loto Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
//timetest
#include<iostream>
#include<fstream>
using namespace std;

ifstream fin("loto.in");
ofstream fout("loto.out");
unsigned k;

struct unit{
    unsigned val;
    short pred;
};

unsigned poz(unsigned li,unsigned ls,unit v[]){
    int c,v0=0,v1=-1;
    unit d;

    while(li<ls){
        if(v[li].val > v[ls].val){
            d.val=v[li].val;    d.pred=v[li].pred;
            v[li].val=v[ls].val;    v[li].pred=v[ls].pred;
            v[ls].val=d.val;    v[ls].pred=d.pred;
            c=v0; v0=-v1;   v1=-c;
        }
        li+=v0;
        ls+=v1;
    }
    return li;
}

void sort(unit v[],unsigned li,unsigned ls){
    unsigned k;
    if(li<ls){
        k=poz(li,ls,v);
        sort(v,li,k-1);
        sort(v,k+1,ls);
    }
}

int caut_bin(unit v[],unsigned n_v,unsigned val){
    unsigned k,li=1,ls=n_v+1;

    while(li<ls){
        k=(li+ls)/2;
        if(val<v[k].val)    ls=k-1;
        else
            if(val>v[k].val)    li=k+1;
            else break;
    }

    if(v[k].val==val)   return k;
    return 0;
}

int main(){
    unit pos1[101],pos2[10001],pos3[1000001];
    unsigned val[100];  //toate valorile date
    unsigned n_pos[3]={0}; //maxlim pt posk[]
    unsigned i,j;
    unsigned nr; //Suma
    short n;

    //procesez toate sumele posibile
    fin>>n; fin>>nr;
    for(i=0;i<n;i++){
        fin>>val[i];
        pos1[n_pos[0]].val=val[i];
        pos1[n_pos[0]].pred=0;
        n_pos[0]++;
        for(j=0;j<n_pos[0];++j){
            pos2[n_pos[1]].val=val[i]+pos1[j].val;
            pos2[n_pos[1]].pred=i;
            n_pos[1]++;
        }
        for(j=0;j<n_pos[1];++j){
            pos3[n_pos[2]].val=val[i]+pos2[j].val;
            pos3[n_pos[2]].pred=i;
            n_pos[2]++;
        }
    }
    sort(pos2,0,n_pos[1]);
    sort(pos3,0,n_pos[2]);

    for(i=1;i<n_pos[2];i++){
        j=caut_bin(pos3,n_pos[2],nr-pos3[i].val);
        if(j)   break;
    }

    if(pos3[i].val+pos3[j].val != nr)   cout<<-1;
    else cout<<1;


    return 0;
}