小有偏差:组队竞速

【组队竞赛】牛牛举办了一次编程比赛 , 参加比赛的有 3*n 个选手 , 每个选手都有一个水平值 a_i. 现在要将这些选手进行组队 , 一共组成 n 个队伍 , 即每个队伍 3 . 牛牛发现
队伍的水平值等于该队伍队员中第二高水平值。
例如 :
输入:

 

2
5 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值