На приведенный ниже вопрос, чем отличаются обе функции. Я пробовал стресс-тестирование, и функция возвращает один и тот же результат. Я пытаюсь отправить функцию продукта на сайт конкурентного программирования, он возвращает неправильный ответ для некоторых тестовых случаев, в то время как все тестовые примеры проходят для функции max_dot_product.
Задача. Даны две последовательности 𝑎1, 𝑎2, . . . , 𝑎𝑛 (𝑎𝑖 — прибыль за клик по 𝑖-му объявлению) и 𝑏1, 𝑏2, . . . , 𝑏𝑛 (𝑏𝑖 является среднее количество кликов в день 𝑖-го слота), нам нужно разбить их на 𝑛 пар (𝑎𝑖 , 𝑏𝑗 ) так, что сумма их произведений максимальна.
Формат ввода. В первой строке записано целое число 𝑛, во второй — последовательность целых чисел 𝑎1, 𝑎2, . . . , 𝑎𝑛, третья содержит последовательность целых чисел 𝑏1, 𝑏2, . . . , 𝑏𝑛.
Ограничения. 1 ≤ 𝑛 ≤ 103 ; −105 ≤ 𝑎𝑖 , 𝑏𝑖 ≤ 105 для всех 1 ≤ 𝑖 ≤ 𝑛.
Выходной формат. Выведите максимальное значение ∑︀𝑛 𝑖=1 𝑎𝑖𝑐𝑖 , где 𝑐1, 𝑐2, . . . , 𝑐𝑛 является перестановкой 𝑏1, 𝑏2, . . . , 𝑏𝑛.
int comp(long long a,long long b)
{
return a>b;
}
long long max_dot_product(vector<int> a, vector<int> b) {
std::sort(a.begin(), a.end());
std::sort(b.begin(), b.end());
vector<long long> c;
c.reserve(a.size());
std::transform(a.begin(), a.end(), b.begin(), std::back_inserter(c),
std::multiplies<long long>());
long long product = std::accumulate(c.begin(), c.end(), 0ll);
return product;
}
long long product(vector<int> a, vector<int> b) {
long long product=0;
sort(a.begin(),a.end(),comp);
sort(b.begin(),b.end(),comp);
for (int i = 0; i < a.size(); i++) {
product+=a[i]*b[i];
}
return product;
}
@JerryJeremiah Я обновил вопрос с помощью функции сравнения
Функция max_dot_product()
вычисляет произведения элементов a
и b
, преобразуя их в long long
и затем выполняя умножение. Это происходит из-за использования std::multiplies<long long>()
, который создает функтор с operator()
, который принимает два аргумента long long
и возвращает их произведение как long long
.
Для сравнения product+=a[i]*b[i]
вычисляет произведение a[i]*b[i]
как int
(поскольку и a[i]
, и b[i]
имеют тип int
), а затем преобразует результат этого в long long
, прежде чем добавить его к product
.
Следствием этого является то, что если результат вычисления любого из a[i]*b[i]
(для любого i
) переполняет int
, функция product()
имеет неопределенное поведение.
Это можно исправить (по крайней мере, с точки зрения полученных результатов), изменив утверждение product += a[i]*b[i]
на product += (long long)a[i]*b[i]
. Это явно преобразует a[i]
в long long
и, согласно правилам преобразования, также неявно продвигает b[i]
в long long
ПЕРЕД их умножением и получением результата типа long long
, который затем добавляется к product
.
В product() операторы сортировки принимают компаратор, а в max_dot_product() операторы сортировки используют естественный порядок. Это может легко изменить ситуацию, но вы не предоставляете функцию сравнения.