【组队竞赛】牛牛举办了一次编程比赛 , 参加比赛的有 3*n 个选手 , 每个选手都有一个水平值 a_i. 现在要将这些选手进行组队 , 一共组成 n 个队伍 , 即每个队伍 3 人 . 牛牛发现队伍的水平值等于该队伍队员中第二高水平值。例如 :输入:
25 2 8 5 1 5输出 :10
一个队伍三个队员的水平值分别是 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.
题解:
这道题,怎么说呢!
是我太轻敌。
3n个数据选出n个水平值,so easy!直接3n个数据一排序,剔除n个数据,下面的n个数据就是我们想要的水平值。
说实话,看到这个题,我脑子直接出思路。太爽了。编码完之后,测试不过。想抽自己!
大家看:
1 2 5 5 5 8 刚才的思路没什么问题
但是: 1 2 5 5 7 8按照刚才的思路 输出10即5+5;但是5+7 它不香吗,不符合要求吗!哎,这就是我的悲哀!
所以我们要调整一下思路:
将数据排序,删除一个最大的数后,再取最大的数(即刚才次大的数);一次循环直到取够N次数据
代码:
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int n;
cin>>n;
priority_queue<int> que;
for(size_t i=0;i<3*n;++i)
{
int t;
cin>>t;
que.push(t);
}
long long ret=0;
for(size_t i=0;i<n;++i)
{
que.pop();
ret+=que.top();
que.pop();
}
cout<<ret<<endl;
return 0;
}
你们的 【三连】 是给Qyuan最大的肯定!
↓ ↓ ↓
注:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊!
如果需要练习的小伙伴,可以打开下方链接。
链接:https://www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b