1 条题解

  • 0
    @ 2025-7-15 18:18:25

    方法思路

    1. 吸引度为 |点赞数 - 点踩数|,要使其最大化,我们需要让点赞数和点踩数的差值尽可能大
    2. 对于每个帖子,我们有两种选择:选择或不选择
    3. 如果选择一个帖子,它会对点赞数和点踩数分别产生贡献
    4. 我们可以将每个帖子看作是对点赞数和点踩数差值的贡献:(a[i] - b[i])
    5. 如果贡献为正,它会增加点赞数与点踩数的差值;如果为负,它会减少差值
    6. 因此,我们可以贪心地选择所有贡献为正的帖子来增加点赞数,或选择所有贡献为负的帖子来增加点踩数
    7. 最终,取两种情况的最大值

    代码实现

    Java
    import java.util.*;
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int n = Integer.parseInt(br.readLine());
            
            long[] a = new long[n];
            long[] b = new long[n];
            
            String[] likes = br.readLine().split(" ");
            String[] dislikes = br.readLine().split(" ");
            
            for (int i = 0; i < n; i++) {
                a[i] = Long.parseLong(likes[i]);
                b[i] = Long.parseLong(dislikes[i]);
            }
            
            long sumLikes = 0;
            long sumDislikes = 0;
            
            for (int i = 0; i < n; i++) {
                // 如果选择这个帖子会增加点赞数与点踩数的差值
                if (a[i] > b[i]) {
                    sumLikes += a[i];
                    sumDislikes += b[i];
                }
            }
            
            long maxDiff1 = Math.abs(sumLikes - sumDislikes);
            
            sumLikes = 0;
            sumDislikes = 0;
            
            for (int i = 0; i < n; i++) {
                // 如果选择这个帖子会增加点踩数与点赞数的差值
                if (a[i] < b[i]) {
                    sumLikes += a[i];
                    sumDislikes += b[i];
                }
            }
            
            long maxDiff2 = Math.abs(sumLikes - sumDislikes);
            
            System.out.println(Math.max(maxDiff1, maxDiff2));
        }
    }
    
    
    Python
    def max_attraction():
        n = int(input())
        likes = list(map(int, input().split()))
        dislikes = list(map(int, input().split()))
        
        sum_likes1 = 0
        sum_dislikes1 = 0
        
        # 选择所有 likes > dislikes 的帖子
        for i in range(n):
            if likes[i] > dislikes[i]:
                sum_likes1 += likes[i]
                sum_dislikes1 += dislikes[i]
        
        max_diff1 = abs(sum_likes1 - sum_dislikes1)
        
        sum_likes2 = 0
        sum_dislikes2 = 0
        
        # 选择所有 likes < dislikes 的帖子
        for i in range(n):
            if likes[i] < dislikes[i]:
                sum_likes2 += likes[i]
                sum_dislikes2 += dislikes[i]
        
        max_diff2 = abs(sum_likes2 - sum_dislikes2)
        
        return max(max_diff1, max_diff2)
    
    print(max_attraction())
    
    
    C++
    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        
        vector<long long> 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 sum_likes1 = 0, sum_dislikes1 = 0;
        
        // 选择所有 likes > dislikes 的帖子
        for (int i = 0; i < n; i++) {
            if (a[i] > b[i]) {
                sum_likes1 += a[i];
                sum_dislikes1 += b[i];
            }
        }
        
        long long max_diff1 = abs(sum_likes1 - sum_dislikes1);
        
        long long sum_likes2 = 0, sum_dislikes2 = 0;
        
        // 选择所有 likes < dislikes 的帖子
        for (int i = 0; i < n; i++) {
            if (a[i] < b[i]) {
                sum_likes2 += a[i];
                sum_dislikes2 += b[i];
            }
        }
        
        long long max_diff2 = abs(sum_likes2 - sum_dislikes2);
        
        cout << max(max_diff1, max_diff2) << endl;
        
        return 0;
    }
    
    
    • 1

    信息

    ID
    83
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    1
    已通过
    1
    上传者