组队竞赛、删除公共字符题解

目录

1.组队竞赛

2.删除公共字符 


1.组队竞赛

组队竞赛__牛客网 (nowcoder.com)

题解:

关键点:队伍的水平值等于队员第二高水平值

细节点:选手水平值<=10^9,int类型的数据范围<2147483647,3个10^9就已经超过int数据范围,所以在计算合值我们采用long long类型。

        要想合值最大,我们就要每次取得的第二大水平值最大,那么我们的划分就应该选2个大数,1个小数,尽可能的保证第二个水平值较大。

        这样一想就简单了,我们只需要把数据从小到大排序,倒着取第二大的数即可。

 假设有n组,就寻找n次,数据个数为size,在数组中,寻找第二大数有公式:a[size-2*(i+1)]

 代码:

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {
    int n=0;
    while(cin>>n)
    {
        long long sum=0;
        vector<int>v;
        v.resize(3*n);
        for(int i=0;i<3*n;i++)
        {
            cin>>v[i];
        }
        //排序
        sort(v.begin(),v.end());
        for(int i=0;i<n;i++)
        {
            //公式:每次找划分第二大的数,划分最小数+2最大数,sum+第二大数
            sum+=v[v.size()-2*(i+1)];
        }
        cout<<sum<<endl;
    }
    return 0;
}

2.删除公共字符 

删除公共字符__牛客网 (nowcoder.com)

题解:

思路:删除公共字符,我们只需要把公共字符做个标记,当遍历第一个字符串的时候如果该字符已被标记则删除,我们可以采用哈希映射的方式(unordered_map也行),这里我们用一个256(ASCII码共有256个字符)个int大小的数组进行映射统计。

代码:

#include <iostream>
#include<string>
using namespace std;

int main() {
    string str1;
    string str2;
    getline(cin,str1);
    getline(cin,str2);
    //采用哈希映射的思想
    int hash[256]={0};
    for(int i=0;i<str2.size();i++)
    {
        hash[str2[i]]++;
    }
    string res="";
    for(int i=0;i<str1.size();i++)
    {
        if(!hash[str1[i]])
            res+=str1[i];
    }
    cout<<res<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/bang___bang_/article/details/131765863
今日推荐