# 讨厌鬼的组合帖子
这个问题本质上是要找到两个数组的子集,使得这两个子集之间的差的绝对值最大。
问题可以简化为寻找两个数列之间最大可能的差的绝对值。
贪心思路如下:
计算差异,首先,我们可以计算每个帖子的点赞数和点踩数的差值 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
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
@2021-2025 代码随想录 版权所有 粤ICP备19156078号