Cod sursa(job #1008700)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 11 octombrie 2013 17:33:15
Problema Loto Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 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);

    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) break;

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

               if (iS>=iSuma) break;

               TSuma NewElement=TSuma(iS,i,j,q);

               _vSumTriplets.insert(NewElement);
            }
        }

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

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

               iDiff=iSuma-iS;

               TSuma elElement=TSuma(iDiff,1,1,1);

               std::set<TSuma>::iterator it;
               it = _vSumTriplets.find(elElement);

               if (it!=_vSumTriplets.end())
               {
                   elElement=*it;
                   fprintf(fout,"%d %d %d %d %d %d",_vTickets[i],_vTickets[j],_vTickets[q],
                           _vTickets[elElement.iIndex1],_vTickets[elElement.iIndex2],_vTickets[elElement.iIndex3]);
                   fclose(fout);

                   return 0;
               }

            }

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

    return 0;
}