目录
牛客编程_组队竞赛
解析代码
队伍的水平值等于该队伍队员中第二高水平值,为了所有队伍的水平值总和最大的解法,也就是说每个队伍的第二个值是尽可能大的值。所以实际值把最大值放到最右边,最小值放到最左边。
本题的主要思路是贪心算法,贪心算法其实很简单,就是每次选值时都选当前能看到的局部最解忧,所以这里的贪心就是保证每组的第二个值取到能选择的最大值就可以,我们每次尽量取最大,但是最大的数不可能是中位数,所以退而求其次,取每组中第二大的加到sum中。
(自己想的排序后输出中间1/3,想错了)正解代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
long long n = 0, sum = 0;
cin >> n;
int v[3 * n];
for (int i = 0; i < 3 * n; i++)
{
cin >> v[i];
}
sort(v, v + 3 * n); // 排序后依次拿最左边和最右边两个组队
int i = 3 * n - 2;
while(n--)
{
sum += v[i]; // 中间值是最右边两个的左边元素
i -= 2;
}
cout << sum;
return 0;
}
// 64 位输出请用 printf("%lld")