Cod sursa(job #760133)

Utilizator silviu982001Borsan Silviu silviu982001 Data 20 iunie 2012 12:47:58
Problema Loto Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <algorithm>
#define l 105
using namespace std;
ifstream f ( "loto.in" );
ofstream g ( "loto.out" );
int  ok1,ok2,sum[l*l*l*3],v[l],N,i,j,t,n,S,V1,V2,st;
int caut ( int val )
{
    int step=st,p=0;
    for ( ; step; step/=2 )
        if ( p+step<=N&&sum[p+step]<=val ) p+=step;
    if ( sum[p]==val&&p!=0 ) return val;
    else return -1;
}
int main()
{

    f>>n>>S;
    for ( i=1; i<=n; i++ ) f>>v[i];

    for ( i=1; i<=n; i++ )
        for ( j=1; j<=n; j++ )
            for ( t=1; t<=n; t++ )       {
                N++;
                sum[N]=v[t]+v[j]+v[i];
            }
sort(sum+1,sum+N+1);

 for ( st=1; st<N; st*=2 );


    for ( i=1; i<=N; i++ )
    if ( caut ( S-sum[i] )!=-1) {
            V1=sum[i];
            V2=caut ( S-sum[i] );
            break;
        }

if (V1+V2!=S) g<<-1; else
    for ( i=1; i<=n; i++ )
        for ( j=1; j<=n; j++ )
            for ( t=1; t<=n; t++ )
            {
                if ( ok1==0&&v[i]+v[j]+v[t]==V1 ) {
                    g<<v[i]<<" "<<v[j]<<" "<<v[t]<<" ";
                    ok1=1;
                }
                if ( ok2==0&&v[i]+v[j]+v[t]==V2 ) {
                    g<<v[i]<<" "<<v[j]<<" "<<v[t]<<" ";
                    ok2=1;
                }
            }
    f.close();
    g.close();
    return 0;
}