zoukankan      html  css  js  c++  java
  • 挖掘机技术哪家强编程题-编程练习题(100)

    目录

    问题:

    分析:

    C++代码(数组实现):

    C++STL代码(map实现):

    总结:


    问题:

    9.

    【问题描述】

    为了用事实说明挖掘机技术到底哪家强,组织一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

    【输入形式】

    输入在第1行给出不超过10^{5}的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号、及其比赛成绩(百分制),中间以空格分隔。

    【输出形式】

    在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。

    【样例输入】

    6
    3 65
    2 80
    1 100
    2 70
    3 40
    3 0

    【样例输出】

    2 150

    【问题说明】

    建议练习使用STL中的map

    分析:

    方法1:可以使用数组下标表示学校编号,对应下标存入总分。这种做法存在一个问题,我们并不知道学校的编号是如何编排的,我们只能申请一个100000大小的数组(假设每个人都来自不同学校),会浪费大量的空间,所以最好使用STL中的map容器。

    方法2:使用map和数组方法差不多,使用map的key表示学校编号,value表示总分,每次查找map中是否有对应的学校编号,有的话就将当前值和map的value相加再存入map的value中。然后再迭代遍历map找到最大的key输出学校编号和总分。

    C++代码(数组实现):

    #include <iostream>
    #include <map>
    
    using namespace std;
    
    int main()
    {
        int N;   //参赛人数
        int athlete[100000] = {0};
        int sub; //数组下标
        int temp;
    
        cin >> N;
        for(int i=0; i<N; i++)
        {
            cin >> sub;
            cin >> temp;
            athlete[sub] += temp;
        }
        sub = 1;
        for(int j=2; j<1000000; j++)
        {
            if(athlete[sub] < athlete[j])
            {
                sub = j;
            }
        }
        cout << sub << ' ' << athlete[sub] <<endl;
        return 0;
    }
    

    C++STL代码(map实现):

    #include <iostream>
    #include <map>
    
    using namespace std;
    
    int main()
    {
        int N;                       //参赛人数
        map<int,int> mapAthlete;     //存放参赛学校编号及总分
        map<int,int>::iterator iter; //迭代器
        int key;          //键值
        int temp;         //中间变量
        int maxScor = 0;  //总分最大
    
        cin >> N;
        for(int i=0; i<N; i++)
        {
            cin >> key;
            cin >> temp;
            iter = mapAthlete.find(key);  //在map中查找key学校是否存在
            if(iter != mapAthlete.end())  //如果存在的话就只将分数加进总分,不存在就新加入一个
            {
                iter->second = iter->second + temp;
            }else{
                mapAthlete[key] = temp;
            }
        }
    
        for(iter = mapAthlete.begin() ; iter != mapAthlete.end() ; iter++)  //找到总分最大的学校编号及分数
        {
            if(iter->second > maxScor)
            {
                maxScor = iter->second;
                key = iter->first;
            }
        }
        cout << key << ' ' <<maxScor;
        return 0;
    }

    总结:

    这道题使用数组也可以,但是使用map容器的好处就是节省空间,而且时间复杂度也会小很多,如果使用数组,不光得申请10^{5}大小的数组,还得循环10^{5}次才能找到最大的总分。再就是学校编号不确定,如果学校编号使用类似201810220937这样的数字,那么我们申请10^{5}大小的数组就不够用了。

  • 相关阅读:
    Hadoop Yarn 框架原理及运作机制及与MapReduce比较
    模型驱动与属性驱动区别
    spark伪分布式的安装
    大数据集群的常见问题
    linux常用命令
    大数据集群ssh登录其他机器失败 RSA host key for zb03 has changed and you have requested strict checking. Host key verification failed.
    Python 地点转化为经纬度
    Hbase原理、基本概念、基本架构
    struts2的java.lang.NoSuchMethodException错误
    抽象工厂
  • 原文地址:https://www.cnblogs.com/www-helloworld-com/p/10202955.html
Copyright © 2011-2022 走看看