Cod sursa(job #851726)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 10 ianuarie 2013 13:16:57
Problema Loto Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <iostream>
#include <fstream>
using namespace std;
long long int s,numere[105],sume[1000005],key,f,k,inceput,sfarsit,sol,mijloc,n;
int bb,l,j;
bool gasit=false,doilea=false,treilea=false;
ifstream ka("loto.in");
ofstream ki("loto.out");

void cauta(long long int ceva)
{
    gasit=false;
    for(bb=1;bb<=n;bb++)
    {
        for(l=1;l<=n;l++)
        {
            for(j=1;j<=n;j++)
            {
                if(numere[bb]+numere[l]+numere[j]==ceva)
                {ki<<numere[bb]<<" "<<numere[l]<<" "<<numere[j]<<" ";
                gasit=true;
                break;}
            }
            if(gasit==true)
            break;
        }
        if(gasit==true)
        break;
    }
}
void suma()
{
    f++;
    sume[f]=numere[bb]+numere[l]+numere[j];
}

int main()
{
    ka>>n>>s;
    f=0;
    for(int i=1;i<=n;i++)
    {
        ka>>numere[i];
    }
    for(bb=1;bb<=n;bb++)
    {
        if(!doilea)
        {for(l=1;l<=n;l++)
        {
            if(!treilea)
            {for(j=1;j<=n;j++)
            {
                suma();
            }
            treilea=true;
            j--;}
            else
            {
            suma();
            }
        }
        doilea=true;
        l--;
        }
        else
        {
            suma();
        }

    }
    for(int i=1;i<=f;i++)
    {
        inceput=1;
        sfarsit=f;
        while(inceput<=sfarsit)
        {
            if(inceput==sfarsit-1)
            {
                if(sume[inceput]==s-sume[i])
                {sol=s-sume[i];
                break;}
                else if(sume[sfarsit]==s-sume[i])
                    {sol=s-sume[i];
                    break;}

            }
            else
            {
            mijloc=(inceput+sfarsit)/2;
            if(sume[mijloc]>s-sume[i])
            sfarsit=mijloc-1;
            if(sume[mijloc]<s-sume[i])
            inceput=mijloc+1;
            if(sume[mijloc]==s-sume[i])
            {sol=s-sume[i];
            break;}
            }
        }
    }
    cout<<"ceva";
    if(sol==0)
    ki<<"-1";
    else
    {
        cauta(sol);
        cauta(s-sol);
    }
    return 0;
}