牛牛举办的组队编程比赛

18 篇文章 2 订阅

题目:
牛牛举办了一次编程比赛,参加比赛的有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)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值