解法一:贪心

两个数组分别按升序排列,然后正数和正数相乘、负数和负数相乘,且两者的绝对值尽可能大(数学原理)。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. long long A[100005], B[100005];
  4. int main() {
  5. ios::sync_with_stdio(false);
  6. cin.tie(0);
  7. int lenA, lenB;
  8. cin >> lenA;
  9. for (int i = 0; i < lenA; ++i) {
  10. cin >> A[i];
  11. }
  12. cin >> lenB;
  13. for (int i = 0; i < lenB; ++i) {
  14. cin >> B[i];
  15. }
  16. sort(A, A + lenA);
  17. sort(B, B + lenB);
  18. double total = 0;
  19. int head = 0, tail = lenB - 1;
  20. for (int i = 0; i < lenA; ++i) {
  21. if (A[i] < 0) {
  22. if (B[head] < 0) {
  23. total += A[i] * B[head];
  24. ++head;
  25. }
  26. } else {
  27. break;
  28. }
  29. }
  30. for (int i = lenA - 1; i >= 0; --i) {
  31. if (A[i] > 0) {
  32. if (B[tail] > 0) {
  33. total += A[i] * B[tail];
  34. --tail;
  35. }
  36. } else {
  37. break;
  38. }
  39. }
  40. cout << fixed;
  41. cout << setprecision(0) << total << '\n';
  42. }