Pagini recente » Cod sursa (job #1423124) | Cod sursa (job #2499664) | Cod sursa (job #1727554) | Cod sursa (job #2592545) | Cod sursa (job #2289390)
#include <bits/stdc++.h>
using namespace std;
vector<int> theNumbers;
vector<int> allSums;
bool itWorkedLeft = false;
bool itWorkedRight = false;
bool youShouldBreakLeft = false;
bool youShouldBreakRight = false;
int nr, lucky;
string leftTicket = "";
string rightTicket = "";
ifstream in("loto.in");
ofstream out("loto.out");
void findSums(){
int temp;
for(int item1 : theNumbers)
for (int item2 : theNumbers)
for (int item3 : theNumbers){
allSums.push_back(item1+ item2 + item3);
}
sort( allSums.begin(), allSums.end() );
allSums.erase( unique( allSums.begin(), allSums.end() ), allSums.end() );
}
void findSum(int sum, string past, int limit, bool &test, char parte){
if (sum > lucky || limit < 0 || test){
if (parte == 'l')
youShouldBreakLeft = true;
else
youShouldBreakRight = true;
return;
}
if (sum == lucky && limit == 0){
if (parte == 'l')
leftTicket = past;
else
rightTicket = past;
test = true;
return;
}
for (int item : theNumbers){
int temp = sum + item;
string str;
if (past == ""){
str = to_string(item);
} else {
str = past + " " + to_string(item);
}
findSum(temp, str, limit - 1, test, parte);
if (parte == 'l' && youShouldBreakLeft)
break;
if (parte == 'r' && youShouldBreakRight)
break;
}
}
int main(){
int n, temp;
in >> n >> nr;
while(n--){
in >> temp;
theNumbers.push_back(temp);
}
findSums();
for (int i = 0, j = allSums.size() - 1; i <= j; ){
if (allSums[j] > nr){
j--;
}
int temp = allSums[i] + allSums[j];
if (temp == nr){
if (allSums[i] == allSums[j]){
lucky = allSums[i];
findSum(0, "", 3, itWorkedLeft, 'l');
if (itWorkedLeft){
out << leftTicket << " " << leftTicket;
return 0;
} else {
youShouldBreakLeft = false;
youShouldBreakRight = false;
itWorkedLeft = false;
itWorkedRight = false;
i++;
}
}else {
lucky = allSums[i];
findSum(0, "", 3, itWorkedLeft, 'l');
lucky = allSums[j];
findSum(0, "", 3, itWorkedRight, 'r');
if (itWorkedLeft && itWorkedRight){
out << leftTicket << " " << rightTicket;
return 0;
} else {
youShouldBreakLeft = false;
youShouldBreakRight = false;
itWorkedLeft = false;
itWorkedRight = false;
i++;
}
}
}
if (temp > nr){
j--;
}
if (temp < nr){
i++;
}
}
out << "-1\n";
return 0;
}