题目:
牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10.
输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.
输出描述:
输出一个整数表示所有队伍的水平值总和最大值.
示例1:
输入
2
5 2 8 5 1 5
输出
10
题目分析:
由题目不难看出
个组的水平值是每个组水平中等的那个人,所以实际水平高的人不能作为任何一组的水平值,所以应该让实际水平次于最高的的人作为某一组的水平值.
假设输入为n = 3, 水平值为(已排序):1 2 3 4 5 6 7 8 9,那么将9和8放在一组,8就是这一组的水平值,下一组就应该将7和6放在一组,让6作为这一组的水平值。也就是排序后数组的第3n-2,3n-4,3n-6……等数据相加输出即可。
通俗来讲 规律就是将排完序后的第2n(n>0)大的数据相加输出
代码展示:
#include <iostream>
using namespace std;
void select_sort(int* src, int size) {
for (int i = 0;i < size - 1;i++) {
int Min = i;
for (int j = i + 1;j < size;j++) {
if (src[Min] > src[j]) {
Min = j;
}
}
if (Min != i) {
int tmp = src[Min];
src[Min] = src[i];
src[i] = tmp;
}
}
}
long Average_max(int* src, int size) {
select_sort(src, size);
long average_max = 0;
if (size % 3 != 0) {
return 0;
}
else {
for (int i = 0;i < size / 3;i++) {
average_max += src[size / 3+i*2];
}
}
return average_max;
}
int main() {
/*int n;
int a_i;
int member[256] = { 0 };
cout << "请输入队伍总数n:" << endl;
cin >> n;
cout << "请输入3*n个水平值(int):" << endl;
for (int i = 0;i < 3 * n;i++) {
cin >> a_i;
member[i] = a_i;
}
int outcome=Average_max(member, 3 * n);
cout << outcome << endl;*/
int n;
while (cin >> n) {
int *arr = new int[3 * n];
int i = 0;
for (; i < 3 * n; i++) {
cin >> arr[i];
}
cout << Average_max(arr, 3 * n);
system("pause");
return 0;
}
}
部分代码分析:
void select_sort(int* src, int size)
这段代码是选择排序 详细讲解->https://blog.csdn.net/qq_41359293/article/details/100101219
当然也可以用库函数algorithm的sort排序函数 sort(begin,end)