Cod sursa(job #2745364)

Utilizator Theo_FurtunaTheodor-Florentin Furtuna Theo_Furtuna Data 26 aprilie 2021 13:53:58
Problema Loto Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("loto.in");
ofstream out("loto.out");
int i, j, k, n, s, a[105], suma[250005], r, suma_partiala, verificare;
int cautare(int x, int r, int suma[])
{
	int st = 1,dr = r, m;
	while (st != dr)
	{
		m = (st + dr) / 2;
		if (x > suma[m])
			st = m + 1;
		else
			dr = m;
	}
	if (x == suma[st])
		return 1;
	return 0;
}
void diferenta(int x, int n, int a[])
{
	int i, j, k;
	for (i = 1; i <= n; i++)
		for (j = i; j <= n; j++)
			for (k = j; k <= n; k++)
				if (a[i] +a [j] + a[k] == x)
					out << a[i] << " " << a[j] << " " << a[k] << " ";
}
int main()
{
	in >> n >> s;
	for (i = 1; i <= n; i++)
		in >> a[i];
	for (i = 1; i <= n; i++)
		for (j = i; j <= n; j++)
			for (k = j; k <= n; k++)
				suma[++r] = a[i] + a[j] + a[k];
	sort(suma + 1, suma + r + 1);
	for (i = 1; i <= n; i++)
	{
		if (verificare == 1)
			break;
		for (j = i; j <=n ; j++)
		{
			if (verificare == 1)
				break;
			for (k = j; k <= n; k++)
			{
				suma_partiala = a[i] + a[j] + a[k];
				if (cautare(s - suma_partiala, r, suma))
				{
					out << a[i] << " " << a[j] << " " << a[k] << " ";
					diferenta(s - suma_partiala, n, a);
					verificare = 1;
					break;
				}
			}
		}
	}
	if (verificare == 0)
		out << "-1";
    in.close();
    out.close();
    return 0;
}