На Диком западе ходят купюры номиналами a1,a2,…,am долларов. Однажды ковбой Джо решил ограбить банк. Он выбрал очень неудачный момент для ограбления, ведь сейчас в банке находятся ровно по две купюры каждого существующего номинала.
Ковбой Джо хочет украсть ровно n долларов, ни долларом больше, ни долларом меньше. Помогите ему или сообщите, что его план неосуществим. Если ковбой Джо сможет украсть ровно n долларов, выведите число k — количество украденных купюр. Затем выведите k целых чисел — номиналы купюр. Если решений несколько, вы можете вывести любое. В противном случае выведите −1. Решить на C++!
cpp
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
vector<int> findStolenMoney(int n, vector<int>& denominations) {
unordered_map<int, int> denominationsMap;
for(int denomination : denominations) {
denominationsMap[denomination]++;
denominationsMap[denomination]++;
}
vector<int> stolenMoney;
for(int denomination : denominations) {
int complement = n - denomination;
if(denominationsMap[complement] > 0) {
stolenMoney.push_back(denomination);
stolenMoney.push_back(complement);
return stolenMoney;
}
}
return vector<int>();
}
int main() {
int n;
cin >> n;
int m;
cin >> m;
vector<int> denominations(m);
for(int i=0; i<m; i++) {
cin >> denominations[i];
}
vector<int> stolenMoney = findStolenMoney(n, denominations);
if(stolenMoney.size() > 0) {
cout << stolenMoney.size() << endl;
for(int amount : stolenMoney) {
cout << amount << " ";
}
} else {
cout << -1 << endl;
}
return 0;
}
Данный код сначала считывает значение N и количество номиналов M с помощью встроенного ввода-вывода в C++. Затем он считывает значения каждого номинала в вектор denominations. Затем функция findStolenMoney вызывается с N и denominations в качестве аргументов. Результат сохраняется в векторе stolenMoney. Затем код проверяет, если stolenMoney больше нуля (т.е. пара купюр найдена), он выводит размер stolenMoney, а затем выводит каждое число в stolenMoney. В противном случае, код выводит -1.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет