思路: 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;
}
}