组队竞赛题目
贪心算法
这道题目其实还是挺简单的,关键就是要注意题目描述中的队伍水平值等于队伍队员中第二高水平值。
为了让每个队伍的水平值总和最大,就需要每个队伍的第二水平值是尽可能大的值,又因为第二水平值不是最大值,所以我们用贪心算法取局部第二大的值。
例如例题中的5 2 8 5 1 5
经过排序之后是 1 2 5 5 5 8
我们可以取最大值8下面的第二大值5作为第一个队伍的水平值,去掉这两个值后的水平值数组为1 2 5 5
再取最大值5 下面的第二大值5作为第二个队伍的水平值。每个队伍的最小值无关紧要。这样就能得到最大的队伍水平值总和。
下面是示例代码:
#include <iostream>
#inlcude <algorithm>
#include <vector>
using namespace std;
int main(){
int n;
//IO型OJ可能有多组输入
while (cin >> n){
long long sum = 0;
vector<int> a;
a.resize(3 * n);
//输入水平值
for (int i = 0; i < 3 * n; ++ i) { cin >> a[i]; }
//排序
a.sort(a.begin(), a.end());
//取局部第二高水平值
for (int i = 0; i < n; ++i){ sum += a[a.szie() - 2 * (i + 1)]; }
cout << sum << endl;
}
return 0;
}
删除公共字符串
提示:哈希映射
可以先创建一个长度为所有字符数目的数组,数组每一个元素置为0,把第二个字符串每一个字符所对应的位置置为1,遍历第一个字符串,如果对应的位置不为0,就保留,为0,就删除。
示例代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string str1, str2;
//用getline接受带有空格的字符串
getline(cin, str1);
getline(cin, str2);
//用哈希映射统计str2中字符出现的次数
int hashtable[256] = 0;
for (int i = 0; i < str2.size(); ++i) { hashtable[str2[i]]++; }
//定义新字符串
string ret = "";
for (int i = 0; i < str1.size(); ++i){
if (hashtable[str1[i]] == 0) { ret += str1[i]; }
}
cout << ret << endl;
return 0;
}