Cod sursa(job #2780637)

Utilizator Mendea_IanisMendea Ianis Teodor Mendea_Ianis Data 7 octombrie 2021 14:53:20
Problema Loto Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include<bits/stdc++.h>

using namespace std;

int n,a,s,V[105];

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

typedef struct tip
{
  int suma;
  int x1;
  int x2;
  int x3;
};
tip M[1000005]; //Aici trebuie sa declaram M-ul de tipul tip (noul tip definit de noi)

bool cmp(tip a, tip b) //Cand declaram un tip nou, compilatorul nu stie dupa ce sa compare 2 valori de acel tip, asa ca trebuie sa ii specificam noi asta
{ //Facem acest lucru printr-o functie booleana (care returneaza 0 sau 1)
    //Sa zicem ca vrem sa sortam crescator dupa suma

    if(a.suma<b.suma) return 1; //Daca a.suma<b.suma, atunci ordinea lor este ok (cel cu suma cea mai mica este primul), asa ca returnam 1 (adica true)
        else return 0; //Altfel, returnam 0 adica false
}
int main()
{
    fin>>n>>s;
    a = 0;
    for(int i = 1;i<=n;i++)
    {
        fin>>V[i];
    }
    for(int i = 1;i<=n;i++)
    {
        for(int j = 1;j<=n;j++)
        {
            for(int k = 1;k<=n;k++)
            {
                a++;
                M[a].suma = V[i] + V[j] + V[k]; //Sa nu uiti sa pui M[a].suma, nu doar M[a] (M[a] este de tipul tip, in timp ce M[a].suma este o componenta de a sa de tip intreg
                M[a].x1 = V[i];
                M[a].x2 = V[j];
                M[a].x3 = V[k];

            }
        }
    }
    sort(M+1,M+a+1,cmp); //Functia de comparare o vom specifica aici, la finalul instructiunii sort
    //Practic, compilatorul nostru in loc sa ia 2 elemente a si b si sa verifice daca a<b folosind operatorul "<" din c++ (care nu prea stie ce sa compare)
    //El calculeaza daca cmp(a,b) este 1 (caz in care e ok) si 0 (caz in care nu e ok)


    for(int i = 1;i<=a;i++)
    {
        int st = 1;
        int dr = a;
        while(st<=dr)
        {
            int mid = (st+dr)/2;
            if(s - M[i].suma == M[mid].suma) //La fel si aici
            {
                fout<<M[i].x1<<' '<<M[i].x2<<' '<<M[i].x3<<' '<<M[mid].x1<<' '<<M[mid].x2<<' '<<M[mid].x3;
                i = a+1;
                break;
            }
            else{
                if(s - M[i].suma < M[mid].suma)
                {
                    dr = mid-1;
                }
                else st = mid + 1;
            }


        }

    }
}