题目链接:牛客_组队竞赛
目录
题目解析
题目让我们求所有队伍的水平值总和最大
由题可得:
队伍的水平值等于该队伍队员中第二高水平值;
随机给定3*n个数,需要自己组队并且得出队伍水平最大值;
我们拿示例分析:
首先为了方便分组我们先把数据排序:
为了能取到第二高水平值, 我们这里先从高位取两个数,再从低位取一个数
这样就能保证我们所取到的第二位为最高值:
此时,最高位的下标位置为:2、4
以此类推:当n为3时,取到的最高位的下标位置为:3,5,7
那么通过推导得到n与最高位的 下标的关系为:
arr[arr.len (数组长度) -2(i+1)(i=0,i<n,i++)]
代码逻辑
cpp
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
//输入
int n = 0;
while (cin >> n)
{
vector<int> arr;
arr.resize(3 * n);
for (int i = 0; i < n * 3; i++)
cin >> arr[i];
//排序
std::sort(arr.begin(), arr.end());
//求值
long long sum = 0;
for (int i = 0; i < n; i++)
sum += arr[arr.size() - (2 * (i + 1))];
cout << sum << endl;
}
return 0;
}
知识补充
1.关于c++中vector之resize & reserve
**capacity:**指容器在分配新的存储空间之前能存储的元素总数。
**size:**指当前容器所存储的元素个数
**reserve:**只改变容器大小(capacity),但并不是真正的创建对象(size)**resize:**resize既分配了空间(capacity),也创建了对象(size)。
参数:
一个表示容器大小,一个表示初始值(默认为0)
reserve只带一个参数,表示容器预留的大小。
参考了这篇博客:c++ vector resize & reserve_c++中将一维数组resize-CSDN博客
C++ 中的sort()排序函数
该函数可以给数组,或者链表list、向量排序。
3个参数:
参数1:第一个参数是数组的首地址,一般是数组名或者迭代器。
参数2:要排序数据的尾地址。
参数3:默认可以不填,如果不填sort会默认按数组升序排序。可以自定义一个排序函数,改排序方式为降序。
需要包含头文件:#algorithm