• 华为OD机考:0036-0037-最多组团数--作业总时长


    0036-最多组团数

    题目描述

    用数组代表每个人的能力
    一个比赛活动要求 参赛团队的最低能力值为N
    每个团队可以由一人或者两人组成
    且一个人只能参加一个团队
    计算出最多可以派出多少只符合要求的队伍

    输入描述

    5
    3 1 5 7 9
    8
    第一行代表总人数,范围 1~500000
    第二行数组代表每个人的能力
    数组大小范围 1~500000
    元素取值范围 1~500000
    第三行数值为团队要求的最低能力值
    1~500000

    输出描述

    3
    最多可以派出的团队数量

    样例

    示例一
    输入
    5
    3 1 5 7 9
    8
    
    输出
    3
    
    说明 3、5组成一队   1、7一队  9自己一队  输出3
    
    输入
    7
    3 1 5 7 9 2 6
    8
    输出
    4
    
    输入
    3
    1 1 9
    8
    输出
    1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    C++ 代码

    //
    // Created by HANWENKE on 2022-09-20.
    //
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace  std;
    int main(){
        int n;//表示有几个人
        cin>>n;
        vector<int>arr;
        arr.reserve(n);
        string temp;
        cin.sync();
        cin.clear();
        getline(cin,temp);
        istringstream stemp(temp);
        int t;
        while(stemp>>t){
            arr.push_back(t);
        }
        cin.sync();
        cin.clear();
        int pow;
        cin>>pow;
        sort(arr.begin(),arr.end());
        //找到数组中第一个大于pow的值--然后给一个新的数组
        auto p= lower_bound(arr.begin(),arr.end(),pow);
        vector<int>arr2;
        for(auto it=arr.begin();it<p;it++){
            arr2.push_back(*it);
        }
        int res=arr.size()-arr2.size();
        int i=0,j=arr2.size()-1;
        while(i<j){
            if(arr2[i]+arr2[j]>=pow){
                i++;
                j--;
                res++;
            }else{
                i++;
            }
        }
        cout<<res;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    0037-作业总时长

    题目描述

    一个工厂有m条流水线
    来并行完成n个独立的作业
    该工厂设置了一个调度系统
    在安排作业时,总是优先执行处理时间最短的作业
    现给定流水线个数m
    需要完成的作业数n
    每个作业的处理时间分别为 t1,t2…tn
    请你编程计算处理完所有作业的耗时为多少
    当n>m时 首先处理时间短的m个作业进入流水线其他的等待
    当某个作业完成时,
    依次从剩余作业中取处理时间最短进入处理

    输入描述

    第一行为两个整数(采取空格分隔)
    分别表示流水线个数m和作业数n
    第二行输入n个整数(采取空格分隔)
    表示每个作业的处理时长 t1,t2…tn 0

    输入描述

    输出处理完所有作业的总时长

    样例

    输入
    3 5
    8 4 3 2 10
    输出
    13
    说明
    先安排时间为2,3,4的三个作业
    第一条流水线先完成作业
    调度剩余时间最短的作业8
    第二条流水线完成作业
    调度剩余时间最短的作业10
    总共耗时 就是二条流水线完成作业时间13(3+10)
    输入
    3 9
    1 1 1 2 3 4 6 7 8
    输出
    13
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    C++代码

    //
    // Created by HANWENKE on 2022-09-20.
    //
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace  std;
    int main(){
        string sin;
        getline(cin,sin);
        vector<int>arr;
        int temp;
        istringstream stemp(sin);
        while(stemp>>temp){
            arr.push_back(temp);
        }
        //arr[0]表示有几条流水线\arr[1]表示有几个独立的作业
        vector<int>arr2;
        //输入n个整数--每个作业的处理时常
        cin.sync();
        cin.clear();
        getline(cin,sin);
       istringstream s2(sin);
       while(s2>>temp){
           arr2.push_back(temp);
       }
       //要优先执行时间最短的作业--所以先排序
        sort(arr2.begin(),arr2.end());
        //如果处理的任务时小于流水线的个数---说明可以一次性处理完--时间为任务最大的时间
        if(arr[1]<=arr[0]){
            cout<<arr2[arr2.size()-1];
            return 0;
        }
        //先让流水线上充满任务
        vector<int>arr3(arr[0]);
        for(int i=0;i<arr[0];i++){
            arr3[i]=arr2[i];
        }
        auto it=arr3.begin();
        for(int i=arr[0];i<arr2.size();i++){
            //从第一个任务开始--一次给每个流水线加上对应的任务
            if(it==arr3.end()){
                it=arr3.begin();
            }
            *it+=arr2[i];
            it++;
        }
        int maxtime=INT32_MIN;
        //求出流水线上--最耗时的那个任务输出
        for(int i=0;i<arr3.size();i++){
            maxtime=max(arr3[i],maxtime);
        }
        cout<<maxtime;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
  • 相关阅读:
    HTML5简介-HTML5 新增语义化标签-HTML5 新增多媒体标签
    人工智能算法一&逻辑回归
    电商API接口与数据分析、数据挖掘的结合
    Leetcode—136.只出现一次的数字【简单】
    加密经济时代:Web3如何改变我们的生活方式
    LabVIEW在应用程序和接口中使用LabVIEW类和接口
    【FPGA教程案例29】基于FPGA的DDS直接数字频率合成器之二——Verilog开发
    Xuperchain竞赛环境安装与工作环境搭建
    SpringBoot 工程打包并运行
    JAVA计算机毕业设计高校设备采购审批管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  • 原文地址:https://blog.csdn.net/weixin_41694574/article/details/126946333