Pagini recente » Cod sursa (job #416110) | Cod sursa (job #1045728)
//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;
}