Pagini recente » Cod sursa (job #2540978) | Cod sursa (job #2730164) | Monitorul de evaluare | Cod sursa (job #1275248) | Cod sursa (job #2597052)
#include <iostream>
#include <cstdio>
#include <cstdint>
#include <cinttypes>
#include <unordered_map>
#include <algorithm>
using namespace std;
struct Sum3
{
int x1;
int x2;
int x3;
uint64_t sum;
bool operator==(const Sum3& p) const
{
return (p.x1 == x1) && (p.x2 == x2) && (p.x3 == x3);
}
};
int main()
{
FILE* infile;
FILE* outfile;
infile = fopen("loto.in", "r");
if (infile == NULL)
{
cout << "error opening infile\n";
return -1;
}
outfile = fopen("loto.out", "w");
if (outfile == NULL)
{
cout << "error opening out file\n";
return -2;
}
int n, i, j, k;
uint64_t s;
uint64_t *numbers;
unordered_map<uint64_t, Sum3> sums;
fscanf(infile, "%d %" SCNd64, &n, &s);
//printf("got n %d s %" SCNd64 " \n", n, s);
numbers = new uint64_t[n];
for (i = 0; i < n; i++)
fscanf(infile, "%" SCNd64, &numbers[i]);
sort(&numbers[0], &numbers[n], greater<int>());
bool found = false;
Sum3 a, b;
for (i = 0; i < n; i++)
{
if (found)
break;
if (numbers[i] > s)
continue;
for (j = 0; j < n; j++)
{
if (found)
break;
if (numbers[i] + numbers[j] > s)
continue;
for (k = 0; k < n; k++)
{
Sum3 e;
e.x1 = i;
e.x2 = j;
e.x3 = k;
e.sum = numbers[i] + numbers[j] + numbers[k];
if (e.sum > s)
continue;
sums[e.sum] = e;
uint64_t target = (s - e.sum);
auto search = sums.find(target);
if (search != sums.end()) {
found = true;
a.x1 = e.x1;
a.x2 = e.x2;
a.x3 = e.x3;
b.x1 = search->second.x1;
b.x2 = search->second.x2;
b.x3 = search->second.x3;
break;
}
}
}
}
/*
bool found = false;
Sum3 a, b;
for (auto& it : sums)
{
if (it.first > s)
continue;
uint64_t target = (s - it.first);
auto search = sums.find(target);
if (search != sums.end()) {
found = true;
a.x1 = it.second.x1;
a.x2 = it.second.x2;
a.x3 = it.second.x3;
b.x1 = search->second.x1;
b.x2 = search->second.x2;
b.x3 = search->second.x3;
break;
}
}*/
if (found)
{
fprintf(outfile, "%" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64,
numbers[a.x1], numbers[a.x2], numbers[a.x3], numbers[b.x1], numbers[b.x2], numbers[b.x3]);
}
else
{
fprintf(outfile, "-1");
}
fclose(infile);
fclose(outfile);
return 0;
}