Как обе функции действуют по-разному, не с точки зрения временной сложности

На приведенный ниже вопрос, чем отличаются обе функции. Я пробовал стресс-тестирование, и функция возвращает один и тот же результат. Я пытаюсь отправить функцию продукта на сайт конкурентного программирования, он возвращает неправильный ответ для некоторых тестовых случаев, в то время как все тестовые примеры проходят для функции 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;
    }

В product() операторы сортировки принимают компаратор, а в max_dot_product() операторы сортировки используют естественный порядок. Это может легко изменить ситуацию, но вы не предоставляете функцию сравнения.

Jerry Jeremiah 14.12.2020 06:26

@JerryJeremiah Я обновил вопрос с помощью функции сравнения

Mahesh 14.12.2020 07:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция 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.

Другие вопросы по теме