Cod sursa(job #1190008)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 24 mai 2014 11:26:08
Problema Loto Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<fstream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;

ifstream fin("loto.in");
ofstream fout("loto.out");

struct nod
{
    int val;
    int x,y,z;
};

int n,S,a[105],tm[10];
nod sol[1000005];

inline void ADD(int p,int w,int l)
{
    nod k;
    k.val=p+w+l;
    k.x=p;
    k.y=w;
    k.z=l;
    sol[++sol[0].val]=k;
}

inline bool cmp(const nod A,const nod B)
{
    return A.val<B.val;
}

int main()
{
    int i,j,l,st,dr,mij;
    bool test;
    fin>>n>>S;
    for (i=1;i<=n;i++)fin>>a[i];
    sort(a+1,a+n+1);
    for (i=1;i<=n;i++)
        {
            ADD(a[i],a[i],a[i]);
            for (j=i+1;j<=n;j++)
                {
                    ADD(a[i],a[i],a[j]);
                    ADD(a[i],a[j],a[j]);
                    for (l=j+1;l<=n;l++)
                        {
                            ADD(a[i],a[j],a[l]);
                            ADD(a[i],a[i],a[l]);
                            ADD(a[i],a[l],a[l]);
                        }

                }
        }
    sort(sol+1,sol+sol[0].val+1,cmp);test=0;
    for (i=1;i<=sol[0].val && !test;i++)
        {
            st=1;dr=sol[0].val;test=0;
            while (st<=dr)
                {
                    mij=(st+dr)>>1;
                    if (sol[mij].val+sol[i].val==S)
                        {
                            tm[1]=sol[mij].x;
                            tm[2]=sol[mij].y;
                            tm[3]=sol[mij].z;
                            tm[4]=sol[i].x;
                            tm[5]=sol[i].y;
                            tm[6]=sol[i].z;
                            sort(tm+1,tm+7);
                            for (l=1;l<=6;l++) fout<<tm[l]<<" ";
                            fout<<"\n";
                            st=dr+1;test=1;
                        }
                    else if (sol[mij].val>S-sol[i].val) dr=mij-1;
                    else st=mij+1;
                }
        }
    return 0;
}