Cod sursa(job #1009920)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 13 octombrie 2013 23:48:17
Problema Loto Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <set>

using namespace std;

std::vector<int>_vNumbers,_vTickets;

struct TSuma
{
    int iSuma,iIndex1,iIndex2,iIndex3;

    TSuma(int iNewSuma, int iNewIndex1, int iNewIndex2,int iNewIndex3)
    {
       iSuma=iNewSuma;
       iIndex1=iNewIndex1; iIndex2=iNewIndex2;
       iIndex3=iNewIndex3;
    }
    bool operator<(const TSuma& another) const
    {
        return iSuma<another.iSuma;
    }
    bool operator==(const TSuma& another) const
    {
        return iSuma==another.iSuma;
    }
};

set <TSuma> _vSumTriplets;

//----------------------------------------------------
void PrintSumTriplets()
{
    std::set<TSuma>::iterator it;

    it=_vSumTriplets.begin();
    while (it!=_vSumTriplets.end())
    {
       TSuma el=*it;
       printf("%d %d %d %d \n",el.iSuma,el.iIndex1,el.iIndex2,el.iIndex3);

       it++;
    }
}
//----------------------------------------------------
void citire(int *iSuma)
{
    FILE * fin = fopen("loto.in","r");
    int iN;

    fscanf(fin,"%d %d",&iN,iSuma);
    int iNumber;

    for (int i=0; i<iN; i++)
    {
       fscanf(fin,"%d",&iNumber);
       if (iNumber <= *iSuma)
          _vNumbers.push_back(iNumber);
    }

    fclose(fin);
}
//----------------------------------------------------
int main()
{
    int iSuma;
    citire(&iSuma);

    _vTickets=_vNumbers;
/*
    sort(_vNumbers.begin(),_vNumbers.end());
    for (int i=0; i<_vNumbers.size(); i++)
    {
        while ((i<_vNumbers.size())&&(_vNumbers[i]==_vNumbers[i+1])) i++;
        _vTickets.push_back(_vNumbers[i]);
    }
*/

    int i,j,q,iS,iS2,iS3;
    for (i=0; i<_vTickets.size(); i++)
        for (j=0; j<_vTickets.size(); j++)
        {
            iS2=_vTickets[i]+_vTickets[j];

            if (iS2<=iSuma)
            for (q=0; q<_vTickets.size(); q++)
            {
               iS=iS2+_vTickets[q];

               if (iS<=iSuma)
               {
                  TSuma NewElement=TSuma(iS,i,j,q);

                  _vSumTriplets.insert(NewElement);
               }
            }
        }

    FILE * fout = fopen("loto.out","w");
   // PrintSumTriplets();

    int iDiff;

    std::set<TSuma>::iterator it,itIndex;
    for (itIndex=_vSumTriplets.begin(); itIndex!=_vSumTriplets.end(); ++itIndex)
    {
        iDiff=iSuma-itIndex->iSuma;

        TSuma elElement=TSuma(iDiff,1,1,1);
        it = _vSumTriplets.find(elElement);

        if (it!=_vSumTriplets.end())
        {
            fprintf(fout,"%d %d %d %d %d %d",_vTickets[itIndex->iIndex1],_vTickets[itIndex->iIndex2],_vTickets[itIndex->iIndex3],
                    _vTickets[it->iIndex1],_vTickets[it->iIndex2],_vTickets[it->iIndex3]);
            fclose(fout);

            return 0;
        }
    }

    fprintf(fout,"-1");
    fclose(fout);

    return 0;
}