题解:#4347 审核通过

tctm169 我以逍遥醉人间 2025-01-13 20:34:33 2

思路: 1.首先,读取输入的人数 N。 2.接着,读取 N 个表示活跃度的整数,并存储在一个数组中。 3.对存储活跃度的数组进行排序,以便将活跃度高的和低的分开。 4.计算总活跃度。 5.尝试不同的分组方式,将人群分为外向型和内向型,以满足两类人群规模尽可能接近,总活跃度差距尽可能大的条件。 6.计算不同分组方式下的活跃度差值,找到满足条件的分组。 7.输出外向型人数、内向型人数和活跃度差值。

核心代码:

for (int i = 0; i < N; ++i) {
        std::cin >> activity[i];
        totalActivity += activity[i];
    }

    std::sort(activity, activity + N, compare);  // 从大到小排序

    int minDiff = totalActivity;  // 最小的活跃度差值
    int outgoingCount = 0;  // 外向型人数
    int introvertedCount = 0;  // 内向型人数
    int targetOutgoingCount = (N + 1) / 2;  // 目标外向型人数,使两类人群规模尽可能接近

    // 遍历不同的分组方式,找到满足条件的分组
    for (int i = 0; i <= N; ++i) {
        int currentOutgoingCount = i;
        int currentIntrovertedCount = N - i;
        int outgoingActivity = 0;  // 外向型人群的总活跃度
        int introvertedActivity = 0;  // 内向型人群的总活跃度

        // 计算外向型人群的总活跃度
        for (int j = 0; j < currentOutgoingCount; ++j) {
            outgoingActivity += activity[j];
        }

        // 计算内向型人群的总活跃度
        for (int k = currentOutgoingCount; k < N; ++k) {
            introvertedActivity += activity[k];
        }

        int diff = std::abs(outgoingActivity - introvertedActivity);  // 活跃度差值

        if (diff < minDiff) {
            minDiff = diff;
            outgoingCount = currentOutgoingCount;
            introvertedCount = currentIntrovertedCount;
        }
    }
{{ vote && vote.total.up }}