Cod sursa(job #851340)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 9 ianuarie 2013 21:24:08
Problema Loto Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <iostream>
#include <fstream>
using namespace std;
int n;
long long int s,numere[105],sume[1000005],key,f,k,inceput,sfarsit,sol,mijloc;
bool gasit=false;
ifstream ka("loto.in");
ofstream ki("loto.out");

void cauta(long long int ceva)
{
    gasit=false;
    for(int bb=1;bb<=n;bb++)
    {
        for(int l=1;l<=n;l++)
        {
            for(int 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;
    }
}

int main()
{
    ka>>n>>s;
    f=1;
    for(int i=1;i<=n;i++)
    {
        ka>>numere[i];
    }
    for(int bb=1;bb<=n;bb++)
    {
        for(int l=1;l<=n;l++)
        {
            for(int j=1;j<=n;j++)
            {
                sume[f]=numere[bb]+numere[l]+numere[j];
                f++;
            }
        }
    }
    for(long long int i=2;i<=f;i++)
    {
        key=sume[i];
        k=i-1;
        while(k>0&&sume[k]>key)
        {
            sume[k+1]=sume[k];
            k--;
        }
        sume[k+1]=key;
    }
    for(long long int i=1;i<=f;i++)
    {
        inceput=1;
        sfarsit=sume[f];
        while(inceput<sfarsit)
        {
            if(inceput==sfarsit-1)
            {
                if(sume[inceput]==s-sume[i])
                sol=s-sume[i];
                else if(sume[sfarsit]==s-sume[i])
                    sol=s-sume[i];
                break;
            }
            else
            {
            mijloc=(inceput+sfarsit)/2;
            if(mijloc>s-sume[i])
            sfarsit=mijloc-1;
            if(mijloc<s-sume[i])
            inceput=mijloc+1;
            if(mijloc==s-sume[i])
            {sol=s-sume[i];
            break;}
            }
        }
    }
    if(sol==0)
    ki<<"-1";
    else
    {
        cauta (sol);
        cauta (s-sol);
    }

}