阿鑫来了  

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;
}

 

posted on 2021-05-10 15:28  阿鑫来了  阅读(197)  评论(0)    收藏  举报