Разбор
Рассмотрим случай массивов с двумя элементами. Пусть . Рассмотрим условие, при котором сумма будет наименьшей. Рассмотрим два варианта перестановок:
Неравенство имеет место, если
Учитывая что , разделим неравенство на . Получим .
То есть сумма (при ) будет минимальной, если .
Рассмотрим пару элементов исходных массивов и . Если , то поменяв местами и , мы уменьшим общую сумму.
Отсортируем массив по возрастанию, а массив по убыванию. Тогда получим сумму с наименьшим значением
Пример
Вычислим сумму для данных из примера.
Возьмем пару для которой и . Поменяем местами и . Сумма уменьшится.
Для заданного примера для любой пары выполняется: если , то . Следовательно текущая перестановка оптимальная.
Рассмотрим получение минимальной суммы, отсортировав по возрастанию, а массив по убыванию.
Реализация алгоритма
Объявим входные массивы чисел.
#define MAX 101 int a[MAX], b[MAX];
Читаем входные данные.
scanf("%d",&n); for(i = 0; i < n; i++) scanf("%d",&a[i]); for(i = 0; i < n; i++) scanf("%d",&b[i]);
Сортируем первый массив по возрастанию, второй — по убыванию.
sort(a,a+n); sort(b,b+n,greater<int>());
Вычисляем искомую минимальную сумму, значение которой может быть -битовым целым.
res = 0; for(i = 0; i < n; i++) res += 1LL * a[i] * b[i];
Выводим результат.
printf("%lld\n",res);
Java реализация
import java.util.*; public class Main { public static void main(String[] args) { Scanner con = new Scanner(System.in); int n = con.nextInt(); Integer a[] = new Integer[n]; for(int i = 0; i < n; i++) a[i] = con.nextInt(); Integer b[] = new Integer[n]; for(int i = 0; i < n; i++) b[i] = con.nextInt(); Arrays.sort(a); Arrays.sort(b,Collections.reverseOrder()); long res = 0; for(int i = 0; i < n; i++) res += 1L * a[i] * b[i]; System.out.println(res); con.close(); } }
Python реализация
Читаем входные данные.
n = int(input()) l1 = list(map(int,input().split())) l2 = list(map(int,input().split()))
Сортируем первый массив по возрастанию, второй — по убыванию.
l1.sort() l2.sort(reverse = True)
Вычисляем искомую минимальную сумму.
res = 0 for i in range(n): res += l1[i] * l2[i]
Выводим результат.
print(res)