1.组队竞赛(排序算法)
牛牛举办了一次编程比赛,参加比赛的有3n个选手,每个选手都有一个水平值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.
输入描述: 输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括3n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值. 输出描述: 输出一个整数表示所有队伍的水平值总和最大值. 示例1:
输入 2
5 2 8 5 1 5
输出 10
思路:因为平均水平都是的队伍中的第二,所以说每次都取第二大的就好,不用纠结数差的问题,每次取最大就好
步骤 先排序 再寻找合适的数字 值得注意的是和应该用long int 因为要考虑越界
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
int main() {
int n;
cin >> n;
vector<int> A;
A.resize(3 * n);
for (int i = 0; i < 3 * n; i++){
cin >> A[i];
}
sort(A.begin(), A.end());//运用算法库中的排序
long int sum = 0;
for (int i = n; i < 3 * n-1; i+=2){
sum += A[i];
}
cout << sum << endl;
system("pause");}
关于公共字符串
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” 输入描述: 每个测试输入包含2个字符串 输出描述: 输出删除后的字符串
示例1: 输入 They are students.
aeiou
输出 Thy r stdnts.
思路 因为是吧第二个输入的字符串中的内容在第一个字符串里面全部删除,所以可以用一个长度为256的整形数组用于标记那些字母需要删除,然后再把第一个字符串中的内容读到另一个中,在过程中比较,看谁被标记
如果被标记则不读入
#include <iostream>
#include<string>
using namespace std;
int main()
{
string str1 ,str2;
getline(cin, str1);
getline(cin, str2);
int temp[256] = {0}; //用于记录要删除的字符
for (int i = 0; i < str2.size(); i++)
{
temp[str2[i]]++; //记录要删除的字符
}
string put;//定义删除后的字符串
for (int i = 0; i < str1.size(); i++)
{
if (temp[str1[i]] == 0)
{
put.push_back(str1[i]); 如果这个字符不被删除,那么直接在后面尾插就行
}
}
cout << put << endl;
}