# 讨厌鬼的组合帖子

题目链接 (opens new window)

这个问题本质上是要找到两个数组的子集,使得这两个子集之间的差的绝对值最大。

问题可以简化为寻找两个数列之间最大可能的差的绝对值。

贪心思路如下:

计算差异,首先,我们可以计算每个帖子的点赞数和点踩数的差值 d[i] = a[i] - b[i]。这样问题就转化为选择这些差值的一个子集,使得子集中所有元素的和的绝对值最大。

遍历可能性,要使得一个数的绝对值尽可能大,可以尝试最大化这个数,或者最小化这个数(使其尽可能小于零)。我们可以分别尝试将所有正的差值加在一起,以及将所有负的差值加在一起。

计算最大吸引度:

  • 将所有正的差值求和得到一个总和。
  • 将所有负的差值求和得到另一个总和。
  • 最后,吸引度即为这两个总和的绝对值中的较大者。

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> a(n), b(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> b[i];
    }

    long long positive_sum = 0;
    long long negative_sum = 0;

    for (int i = 0; i < n; ++i) {
        int difference = a[i] - b[i];
        if (difference > 0) {
            positive_sum += difference;
        } else if (difference < 0) {
            negative_sum += difference;
        }
    }

    // 最大吸引度是正总和或负总和的绝对值中的较大者
    cout << max(abs(positive_sum), abs(negative_sum)) << endl;

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
上次更新:: 3/4/2025, 5:49:45 PM
@2021-2025 代码随想录 版权所有 粤ICP备19156078号