A19508. 社团招新(club)
题目描述
社团招新(club)
题目描述
小 L 是学校算法协会的成员。在今年的学校社团招新中,小 L 一共招收了 n 个新成员,其中 n 为偶数。现在小 L 希望将他们分到协会不同的部门。
算法协会共设有三个部门,其中第 i(1 ≤ i ≤ n)个新成员对第 j(1 ≤ j ≤ 3)个部门的满意度为 ai,j。定义一个分配方案的满意度为所有新成员对分配到的部门的满意度之和,也就是说,若将第 i(1 ≤ i ≤ n)个新成员分配到了第 di∈{1,2,3} 个部门,则该分配方案的满意度为:∑ ni=1 ai,di。
小 L 不希望某一个部门的新成员数量过多。具体地,他要求在分配方案中,不存在一个部门被分配多于n/2个新成员。你需要帮助小 L 求出,满足他要求的分配方案的满意度的最大值。
输入格式
从文件club.in中读入数据。
本题包含多组测试数据。
输入的第一行包含一个正整数 t,表示测试数据组数。
接下来依次输入每组测试数据,对于每组测试数据:
- 第一行包含一个正整数 n,表示新成员的数量;
- 第 i+1(1 ≤ i ≤ n)行包含三个非负整数 ai,1, ai,2, ai,3,分别表示第 i 个新成员对 第 1、2、3 个部门的满意度。
输出格式
输出到文件club.out中。
对于每组测试数据,输出一行一个非负整数,表示满足小 L 要求的分配方案的满意度的最大值。
样例 1 输入
3
4
4 2 1
3 2 4
5 3 4
3 5 1
4
0 1 0
0 1 0
0 2 0
0 2 0
2
10 9 8
4 0 0样例 1 输出
18
4
13样例 1 解释
该样例共包含三组测试数据。
对于第一组测试数据,可以将四个新成员分别分配到第 1, 3, 1, 2 个部门,则三个部门的新成员数量分别为 2, 1, 1,均不超过 4/2=2,满意度为4 + 4 + 5 + 5 = 18。
对于第二组测试数据,可以将四个新成员分别分配到第 1, 1, 2, 2 个部门,则三个部门的新成员数量分别为 2, 2, 0,均不超过4/2=2,满意度为0 + 0 + 2 + 2 = 4。
对于第三组测试数据,可以将两个新成员分别分配到第 2, 1 个部门,则三个部门的新成员数量分别为 1, 1, 0,均不超过2/2=1,满意度为9 + 4 = 13。
样例 2
见选手目录下的club/club2.in与club/club2.ans。
该样例满足测试点 3, 4 的约束条件。
样例 3
见选手目录下的club/club3.in与club/club3.ans。
该样例满足测试点 5 ~ 8 的约束条件。
样例 4
见选手目录下的club/club4.in与club/club4.ans。
该样例满足测试点 9 的约束条件。
样例 5
见选手目录下的 club/club5.in 与 club/club5.ans。
该样例满足测试点 15, 16 的约束条件。
数据范围
对于所有测试数据,保证:
- 1 ≤ t ≤ 5;
- 2 ≤ n ≤ 105,且 n 为偶数;
- 对于所有 1 ≤ i ≤ n,1 ≤ j ≤ 3,均有 0 ≤ ai,j ≤ 2 ×104。

特殊性质 A:
对于所有 1 ≤ i ≤ n,均有 ai,2=ai,3= 0。
特殊性质 B:
对于所有 1 ≤ i ≤ n,均有ai,3 = 0。
特殊性质 C:
对于所有 1 ≤ i ≤ n,1 ≤ j ≤ 3,ai,j 均在 [0, 2 × 104] 中独立均匀随机生成。
参考答案
#include <bits/stdc++.h>
using namespace std;
vector<int> a, b, c;
int main() {
int t;
cin >> t;
while(t--) {
//清空vector
a.clear();b.clear();c.clear();
int n, ans = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int x, y, z;
cin >> x >> y >> z;
if (x >= y && x >= z) {
ans += x;
a.push_back(x - max(y, z));
} else if (y >= x && y >= z) {
ans += y;
b.push_back(y - max(x, z));
} else {
ans += z;
c.push_back(z - max(x, y));
}
}
//判断
n /= 2;
if (a.size() <= n && b.size() <= n && c.size() <= n) {
cout << ans << endl;
} else {
if (a.size() > n) {
sort(a.begin(), a.end());
for (int i = 0; i < a.size()-n; i++) {
ans -= a[i];
}
} else if (b.size() > n) {
sort(b.begin(), b.end());
for (int i = 0; i < b.size()-n; i++) {
ans -= b[i];
}
} else {
sort(c.begin(), c.end());
for (int i = 0; i < c.size()-n; i++) {
ans -= c[i];
}
}
cout << ans << endl;
}
}
return 0;
}