1.组队竞赛
牛牛举办了一次编程比赛, 参加比赛的有3*n个选手, 每个选手都有一个水平值a_i. 现在要将这些选手进行组队, 一共组成n个队伍,即每队3个人. 牛牛发现队伍的水平值等于该队伍队员中的第二高水平值. 为了让比赛更有看头, 牛牛想安排队伍使所有队伍的水平值总和最大.
输入:
2
5,8,6,7,2,1
输出:
14
假如有6个选手, n=2, 水平值分别为1,2,3,4,5,6
先取1,5,6为一组, 肯定能得出一个最大的次大值,然后去2,3,4为一组
假如有9个选手, n=3, 水平值分别为1,2,3,4,5,6,7,8,9
先取1,8,9为一组,再取2,6,7,然后3,4,5
我们由此能得出一个函数来找到他每一组中的水平值的下标.
arr.len-2*(i+1) i<n
代码
#include<stdio.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ long long sum = 0; int n; //使其能循环输入 while (cin >> n){ //在a中创建一个3*n的数据 vector<int>a; a.resize(3 * n); //把数据输入到a中 for (int i = 0; i < 3 * n; i++){ cin >> a[i]; } //按升序排序 sort(a.begin(), a.end()); for (int i = 0; i < n; i++){ sum = sum + a[a.size() - 2 * (i + 1)]; } cout << sum << endl; } system("pause"); return 0; }
扩展知识:
vector是一个动态的序列容器,相当于一个size可变的数组。当需要使用vector的时候,需要包含头文件:#include <vector>,一般加上using namespace std;
相比于数组,vector会消耗更多的内存以有效的动态增长。而相比于其他动态序列容器(deques, lists and forward_lists),vector能更快的索引元素(就像数组一样),而且能相对高效的在尾部插入和删除元素。如果不是在尾部插入和删除元素,效率就没有这些容器高。
#include<stdio.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ vector<int>a; //声明一个int型向量a vector<int> a(10); //声明一个初始大小为10的向量 vector<int> a(10, 1); //声明一个初始大小为10且初始值都为1的向量 vector<int> b(a); //声明并用向量a初始化向量b vector<int> b(a.begin(), a.begin() + 3); //将a向量中从第0个到第2个(共3个)作为向量b的初始值 int n[] = { 1, 2, 3, 4, 5 }; vector<int> a(n, n + 5); //将数组n的前5个元素作为向量a的初值 vector<int> a(&n[1], &n[4]); //将n[1] - n[4]范围内的元素作为向量a的初值 vector<int> a; a.push_back(1); //在尾部加入一个数据1 a.push_back(2); a.pop_back(); //删除最后一个数据 a.insert(a.begin(), 0); //在a.begin()之前加入0 a.erase(a.begin()); //将a.begin()的元素删除 a.erase(a.begin() + 1, a.end()); //将第二个元素以后的元素均删除 //遍历时,像数组一样以下标访问 for (int i = 0; i < a.size(); i++){ cout << a[i]; } /*以vector实现二维数组*/ vector<vector<int>> a(10, vector<int>(5)); //创建一个10行5列的int型二维数组 相当于a[10][5]; /*同理可以创建三维及以上数组,这些多维数组的操作同一维的vector类似。*/ system("pause"); return 0; }
看完vector, 我们来看看resize, 与resize很像的还有reserve
resize(),设置大小(size);
resize带两个参数,一个表示容器大小,一个表示初始值(默认为0)
resize(n)
调整容器的长度大小,使其能容纳n个元素。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。
resize(n,t)
多一个参数t,将所有新添加的元素初始化为t。
resize既分配了空间,也创建了对象。
resize既修改capacity大小,也修改size大小。
reserve(),设置容量(capacity);
reserve只带一个参数,表示容器预留的大小。
reserver()的用法只有一种,reserve(n)预分配n个元素的存储空间。
reserve表示容器预留空间,但并不是真正的创建对象,需要通过insert()或push_back()等创建对象。
reserve只修改capacity大小,不修改size大小,resize既修改capacity大小,也修改size大小。
#include<stdio.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ vector<int>a; //尾插10个元素 for (int i = 1; i < 11; i++){ a.push_back(i); } //打印 for (int i = 0; i < a.size(); i++){ cout << a[i]<<" "; } cout << endl; //把大小修改为15个, 不足的补0 a.resize(15); for (int i = 0; i < a.size(); i++){ cout << a[i] << " "; } cout << endl; //把大小修改为3个, 多余的删除 a.resize(3); for (int i = 0; i < a.size(); i++){ cout << a[i] << " "; } cout << endl; //把大小修改为5个, 不足的补10 a.resize(5, 10); for (int i = 0; i < a.size(); i++){ cout << a[i] << " "; } cout << endl; system("pause"); return 0; }
结果:

使用sort函数要包含头文件#include<algorithm>
#include<iostream> #include<algorithm> using namespace std; bool com(int a, int b) { return a>b; } int main() { //默认由小到大 int a[10] = { 9, 6, 3, 8, 5, 2, 7, 4, 1, 0 }; for (int i = 0; i<10; i++) cout << a[i] << ' '; cout << endl; sort(a, a + 10);//指针 for (int i = 0; i<10; i++) cout << a[i] << ' '; cout << endl; //加入比较函数,实现由大到小 int b[10] = { 9, 6, 3, 8, 5, 2, 7, 4, 1, 0 }; for (int i = 0; i<10; i++) cout << b[i] << ' '; cout << endl; sort(b, b + 10, com); for (int i = 0; i<10; i++) cout << b[i] << ' '; cout << endl; system("pause"); return 0; }

浙公网安备 33010602011771号