Pagini recente » Cod sursa (job #798903) | Cod sursa (job #399318) | Cod sursa (job #916015) | Cod sursa (job #1831207) | Cod sursa (job #2744351)
#include <iostream>
#include <unordered_map> // este un dictionar in care cheile sunt tinute intr-un hash
// hash[*pt].first va fi cheia si hash[*pt].second va fi valoarea
// cheia va fi suma a 3 numere si valoarea va fi numerele care compun acea suma dupa
// formula n^2*i+n*j+k
#include <fstream>
using namespace std;
ifstream fin("loto.in");
ofstream fout("loto.out");
int main() {
unordered_map<int, int> hash; //
int s, n, v[100];
fin >> n >> s; // citim numarul de numere si suma la care trebuie sa ajungem
for (int i = 0; i < n; i++) {
fin >> v[i]; // citim numerele care trebuie sa dea suma S pentru a fi biletul castigator
}
int ok = 0;
int s3 = 0;
// cele 3 for-uri iau toate sumele a 3 elemente
for (int i = 0; i < n && ok == 0; i++) {
for (int j = i; j < n && ok == 0; j++) {
for (int k = j; k < n && ok == 0; k++) {
s3 = v[i] + v[j] + v[k]; // calculam suma a 3 numere si o retinem in s3
hash.insert({s3, n * n * i + n * j + k}); // am inserat suma si numerele care o compun in dictionar
auto it = hash.find(s - s3); // pointer catre suma complementara a lui s3
// sau unordered_map<int,int>::iterator;
// in cazul nostru iteratorul este un pointer catre pozitia in dictionar egala cu cheia noastra
// sau catre end() daca nu exista
if (it != hash.end()) { // daca mi-a gasit o suma complementara astfel incat s = s3 + nr
ok = 1; // marcam ca am gasit raspunsul ca sa oprim for-urile
int nr = it->second; // it -> first este suma complementara, iar it -> second este numarul dupa formula de mai sus
// adica cele 3 numere care trebuie afisate
fout << v[i] << " " << v[j] << " " << v[k] << " " << v[nr % n] << " "; // afisam cele 3 numere actuale si unul din numerele care compune it -> second, adica v[k']
//
// it -> second este defapt nr
nr /= n; // nr devine din n^2*i'+n*j'+k' in n*i' + j'
fout << v[nr % n] << " "; // afisam v[j']
nr /= n; // nr devine din n*i'+j' in i'
fout << v[nr % n] << "\n"; // afisam v[i']
}
}
}
}
if (ok == 0) // daca nu am gasit nicio combinatie inseamna ca nu este posibil
fout << -1 << "\n"; // afisam -1
fin.close();
fout.close();
return 0;
}