正反两个顺序处理。或者每个分成两个数组。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
using namespace std;
#define MAX 100000+10
int coup[MAX], prod[MAX];
int cmp(const void*a, const void*b)
{
return *(int*)b - *(int*)a;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int m = 0, n = 0;
int sum = 0;
scanf("%d", &m);
for (int i = 0; i < m; i++)
scanf("%d", &coup[i]);
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &prod[i]);
qsort(coup, m, sizeof(coup[0]), cmp);
qsort(prod, n, sizeof(prod[0]), cmp);
int i = 0, j = 0;
while (i < m && i < n && coup[i] > 0 && prod[i] > 0)
{
sum += coup[i]*prod[i];
i++;
}
i = m-1, j = n-1;
while (i >= 0 && j >= 0 && coup[i] < 0 && prod[j] < 0)
{
sum += coup[i]*prod[j];
i--,j--;
}
printf("%d", sum);
return 0;
}