文章目录
- 选择题
- 编程题
选择题
编程题
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;int main() {int n = 0;cin >> n;vector<int> v;v.resize(3 * n);int x = 0;for(int i = 0; i < v.size(); i++){cin >> v[i];}sort(v.begin(), v.end());//int sum = 0;long long sum = 0;for(int j = 0; j < n; j++){sum += v[v.size() - (j + 1) * 2];}cout << sum << endl;return 0;
}
// 64 位输出请用 printf("%lld")
在本题中最重要的就是怎么进行分组,然后怎么取到每组里面的中位数:我们选择通过resize扩容vector然后输入数据,去对这组数据进行排序,而分组方式是第一组取一个最小值和最大的两个值,第二组取次小值和次大的两个值,一次类推,这样就保证了我们一定可以去取到次大的值。
因此中位数就是和6,结果sum就是9
而在已经排好序的vector中怎么直接去取到这两组中的中位数呢?
此时就要借助一个公式:**v.size() - 2 * (i + 1)**其中i表示第几组
第0组也就是第1组:中位数下标为6 - 2 = 4
第1组也就是第2组:中位数下标为6 - 4 = 2
其实这个公式也就是从后向前依次取倒数第2个值,size - 2,size - 4就是倒数第二个值和倒数第4个值,注意size值比下标多1
2.
#include <iostream>
using namespace std;int main() {string str1, str2;getline(cin, str1);getline(cin, str2);int hash[256] = {0};for(int i = 0; i < str2.size(); i++){hash[str2[i]]++;}string s;for(int j = 0; j < str1.size(); j++){if(hash[str1[j]] == 0){s += str1[j];}}cout << s << endl;return 0;
}
// 64 位输出请用 printf("%lld")
解题思路:利用哈希映射的特性来解决上述问题,就可以以O(n)的复杂度解决问题,先把不能出现的字符映射到hash表上,在对str1进行遍历,如果它在hash上对应的字符为0,就证明这个字符能出现。注意本题使用getline输入一行字符串