Cod sursa(job #1449526)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 9 iunie 2015 21:44:06
Problema Loto Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <vector>
#include <tuple>
#include <fstream>
#include <algorithm>
using namespace std;

using ll = long long;

constexpr ll suma(const tuple<ll, ll, ll>& x){
	return get<0>(x) + get<1>(x) + get<2>(x); }

constexpr bool operator<(const tuple<ll, ll, ll>& lhs, const tuple<ll, ll, ll>& rhs){
	return suma(lhs) < suma(rhs); }

int main(){
	ifstream f("loto.in");
	ofstream g("loto.out");
	int n, s;
	f >> n >> s;
	vector<tuple<ll, ll, ll> > v;
	v.reserve(n*n*n);
	{
		vector<ll> nr(n, 0ll);
		for(auto& x : nr){
			f >> x; }
		for(auto a = begin(nr), en = end(nr); a != en; ++a){
			for(auto b = a; b != en; ++b){
				for(auto c = b; c != en; ++c){
					v.emplace_back(*a, *b, *c); } } } }
	sort(begin(v), end(v));
	auto stanga = begin(v), dreapta = end(v)-1;
	ll tmp;
	while(stanga < dreapta){
		tmp = suma(*stanga) + suma(*dreapta);
		if(tmp < s){
			++stanga; }
		else if(tmp == s){
			array<ll, 6> paranoie({get<0>(*stanga),
				get<1>(*stanga), get<2>(*stanga),
				get<0>(*dreapta), get<1>(*dreapta),
				get<2>(*dreapta)});
			sort(begin(paranoie), end(paranoie));
			for(const auto x : paranoie){
				g << x << ' '; }
			return 0; }
		else{
			--dreapta; } }
	//implicit n-am iesit cu returnul de mai sus
	g << "-1";
	return 0; }