组队竞赛&删除公共字符

1.组队竞赛

题目描述:

链接:组队竞赛_牛客笔试题_牛客网
来源:牛客网

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

分析:

题目中说三个人一队,队伍的水平值是队伍中排名第二的水平值.

既然涉及到排名第几第几大了,我们自然而然要想到排序,所以可以先把给定的3*n个数据排序,排完序以后,最小的就在左边,最大的在右边.

我们仔细想一下,如果每次取最大的数,那么它一定不能作为这个队伍的水平值,因为没有再比它更大的了,所以放在队伍里一定是第一

反过来,每次取最小的数也是同样的道理,在队伍中一定是第三.

既然这样,最大值和最小值肯定作为不了队伍的水平值(第二大),但是我们可以先每次取一个最大和最小值,这个时候再取一个次最大值,这个时候队伍的水平值也就是次最大值了,也是最合算的了.

所以我们发现,排序之后,从后向前,第一个数是从倒数第二个数开始,每隔一个数取一个数,这样的数加起来,队伍的总水平值一定是最高的.

比如 有题目6个队员,水平值为1 2 5 5 5 8 

从倒数第二个数5开始,(此时组为1 8 5)然后加一下,再隔两个数为5(这个组为 2 5 5),此时 组已经分配完毕,总水平值为5+5=10.符合结果.

所以代码如下

#include
#include
#include
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    long long sum = 0;
    int count = 0;
    vector v;
    v.resize(3*n);
    for(int i = 0; i < v.size(); i++)
    {
        cin >> v[i];
    }
    sort(v.begin(),v.end());
    //每次找完一组count++,最后count==n时,说明组已经找完,结束循环
    for(int i = v.size() - 2; count != n; i-= 2)
    {
        sum += v[i];
        count++;
    }
    cout << sum;
    return 0;
}

删除公共字符

题目描述:

描述

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

输入描述:

每个测试输入包含2个字符串

输出描述:

输出删除后的字符串

示例1

输入:

They are students. 
aeiou

输出:

Thy r stdnts.

分析:

遍历第二个字符串,统计各个字符出现的次数.

再遍历第一个字符串,如果某个字符出现的次数为0,则说明第二个字符串中没有对应的字符,将它放到新的字符串即可.

这题比较简单,用了简单的一个哈希.

代码如下:

#include 
#include
using namespace std;

int main() {
    string s1;
    string s2;
    string s3;
    //注意输入用getline,会录入空格,cin遇到空格就结束了.
    getline(cin,s1);
    getline(cin,s2);
    int hash[256] = {0};
    for(int i = 0; i < s2.size(); i++)
    {
       //统计s2中每个字符出现的次数
        hash[s2[i]]++;
    }
    for(int i = 0; i < s1.size(); i++)
    {
        //如果这个字符没有出现过,则不是公共字符,push即可
        if(hash[s1[i]] == 0)
        {
            s3.push_back(s1[i]);
        }
    }
    cout << s3;
    }

如果有不懂的地方,欢迎提问哦~.

你可能感兴趣的:(算法题,算法,c++,蓝桥杯)