Pagini recente » Borderou de evaluare (job #2083221) | Cod sursa (job #919450) | Borderou de evaluare (job #2859897) | Cod sursa (job #2657523) | Cod sursa (job #851360)
Cod sursa(job #851360)
#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=0;
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++)
{
f++;
sume[f]=numere[bb]+numere[l]+numere[j];
}
}
}
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=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=sume[(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);
}
}