选择题
我们利用程序打印看一下,输出如图所示:
可以看到,%5.3s输出的只有3个字符,并且前面似乎有两个空格
%5.4s输出的有4个字符,前面有一个字符
这里有一些没有注意到的知识点
格式化输出字符串的时候:%m.ns
:
m:输出字符串的宽度
n:左起截取目标字符串的n个字符,并且是右对齐,补空格
- 如果字符串长度 > n > m:这里m就失效了,打印的字符串宽度取决于截取的n个字符
- 如果n > 字符串长度:这里n就失效了,截取的字符串长度大于本身的字符串长度,就相当于%s
所以就可以解释上面的程序了
编程题
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.
**输入描述 **
第一行:一个正整数n(1 <= n <= 10^5)
第二行:包含3*n个整数 a_i (1 <= a_i <= 10^9)a_i表示每一个参赛选手的水平值
输出描述
输出一个整数表示所有队伍的水平值总和最大值
思路分析:
- 主要是贪心算法,每次选值都考虑当前所能看到的局部最优解,这里的贪心就是,保证每一组的第二个值都能选择到最大值,每次都取最大,所以首先进行排序即可!
- 即:
i = length-2; i >= n ; i -= 2
来控制每次把最大的第二项加起来即可
代码实现:
#include<iostream>
#include<vector>
using namespace std;
#include<algorithm>
int main()
{
int n;
while(cin>>n)//防止多组输入
{
long long sum = 0; //记录总和
vector<int> v;
v.resize(3*n); //resize到n个元素
//读入数据
for(size_t i = 0;i<3*n;++i)
{
cin >> v[i]; //读入数组数据
}
//排序
sort(v.begin(),v.end());
//从后往前取第二大
for(size_t i = 3*n-2;i>=n;i-=2)
{
//最大的第二个数.. 第二大的第二个数 ...
sum+=v[i];
}
cout << sum << endl;
}
}
2. 删除公共字符
描述
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
输入描述
每个测试输入包含2个字符串
输出描述
输出删除后的字符串
示例
输入:
They are students. aeiou
输出:
Thy r stdnts.
思路分析
#include<iostream>
using namespace std;
#include<string>
int main()
{
string ret;//结果字符串
string str1,str2;
getline(cin,str1);
getline(cin,str2);
//哈希
int hashtb[256] = {0};
//把str2映射
for(size_t i = 0;i<str2.size();++i)
{
hashtb[str2[i]]++;
}
//遍历str1 如果没有在str2中 就把字符+=到str2
for(size_t i = 0;i < str1.size();++i)
{
if(hashtb[str1[i]] == 0)
{
ret += str1[i];
}
}
cout << ret << endl;
return 0;
}