这道题有两种解决办法,贪心或者动态规划都是可以的,当然贪心会更加简单,拼接博客的吸引度是赞数和踩数差的绝对值,如果令差值最大,显然就是使赞数更多踩数越少或踩数越多赞数越少,显然贪心可以完成这两项,只需要将赞数比踩数多的博客拼接起来和踩数比赞数多的博客拼接起来然后取两个吸引度的最大值即可
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
long long ans1 = 0, ans2 = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
int t;
cin >> t;
if (a[i] > t) {
ans1 += a[i] - t;
} else {
ans2 += t - a[i];
}
}
cout << max(ans1, ans2) << endl;
return 0;
}
python
n = int(input())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
n = len(a)
c = [0] * n
for i in range(n):
c[i] = a[i] - b[i]
c.sort()
sum1 = 0
sum2 = 0
for i in range(n - 1, -1, -1):
if c[i] > 0:
sum1 += c[i]
else: sum2 += -c[i]
print(max(sum1, sum2))
java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
int[] b = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
for (int i = 0; i < n; i++) {
b[i] = sc.nextInt();
}
int max1 = 0, max2 = 0;
long sum1 = 0, sum2 = 0;
for (int i = 0; i < n; i++) {
if (a[i] > b[i]){
sum1 += a[i] - b[i];
}else {
sum2 += Math.abs(a[i] - b[i]);
}
}
System.out.println(Math.max(sum1,sum2));
}
}
小红有n个博客。第i个帖子的点赞数为ai点踩数为bi。你可以选择任意个博客拼接起来。
拼接博客的点赞数和点踩数为所有被拼接博客点赞数和点踩数之和。现在知道一个博客的点赞数为x,点踩数为y,则该博客的吸引度为∣x−y∣。小红需要选择若干个博客拼接起来,使得这个拼接博客的吸引度尽可能大。请你告诉他这个吸引度最大是多少?
第一行输入一个整数n(1≤n≤105)。
第二行输入n个整数ai(1≤ai≤109)
第三行输入n个整数b;(1≤bi≤10)。
一行一个整数,表示最大吸引度。
输入
4
4 2 2 2
4 3 5 5
输出
7
说明
选择第 2、3 个和第 4个帖子组合后,点赞数为 6,点踩数为 13,吸引度为∣6−13∣=7。