• 华为OD机试真题【服务器能耗统计】


    1、题目描述

    【服务器能耗统计】
    服务器有三种运行状态:空载、单任务、多任务,每个时间片的能耗的分别为1、3、4;
    每个任务由起始时间片和结束时间片定义运行时间;
    如果一个时间片只有一个任务需要执行,则服务器处于单任务状志;
    如果一个时间片有多个任务需要执行,则服务器处于多任务状态;
    给定一个任务列表,请计算出从第一个任务开始,到所有任务结束,服务器的总能耗。

    【输入描述】
    第一行的数字表示一共有多少个任务
    后续每行包含由空格分割的两个整数,用于确定每一个任务的起始时间片和结束时间片;
    任务执行时间包含起始和结束时间片,即任务执行时间是左团右闭的;
    结束时间片一定大于等于起始时间片;

    【输出描述】
    一个整数,代表服务器的总能耗

    【样例1】
    输入:
    2
    2 5
    8 9
    输出:
    20
    解释:
    [0,1]没有任务需要执行,能耗为0
    [2,5]处于单任务状态,能耗为34=12
    [6,7]处于空载状态,能耗为1
    2=2
    [8,9]处于单任务状态,能耗为3*2=6
    共计能耗为12+2+6=20

    【样例2】
    输入:

    3
    4 8
    1 6
    2 9
    输出:
    34
    解释:
    [0,1]没有任务需要执行,能耗为0
    [1,1]处于单任务状态,能耗为31=3
    [2,8]处于多任务状态,能耗为4
    7=28
    [9,9]处于单任务状态,能耗为3*1=3
    共计能耗为3+28+3=34

    2、解题思路

    统计出最小和最大的运行时间,并统计从0到最大运行时间之间每个时间的任务数量,遍历每个任务的开始时间到结束时间并将其任务数量加一。最后,遍历统计的任务数量,空载消化1,单任务消化3,多任务消化3,注意是最小开始时间到最大结束时间之间。

    3、参考代码

    import java.util.Scanner;
    
    /**
     * @Author
     * @Date 2023/5/5 22:55
     */
    public class 服务器能耗统计 {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            while (in.hasNext()) {
                int num = in.nextInt();
                int[][] times = new int[num][2];
                int minTime = Integer.MAX_VALUE;
                int maxTime = 0;
    
                for (int i = 0; i < num; i++) {
                    times[i][0] = in.nextInt();
                    times[i][1] = in.nextInt();
                    minTime = Math.min(minTime, times[i][0]);
                    maxTime = Math.max(maxTime, times[i][1]);
                }
                System.out.println(total(num, times, minTime, maxTime));
            }
        }
    
        public static int total(int num, int[][] times, int minTime, int maxTime) {
            // 统计每个时间的任务数
            int[] time = new int[maxTime + 1];
            for (int i = 0; i < num; i++) {
                for (int j = times[i][0]; j <= times[i][1]; j++) {  // 遍历开始时间到结束时间
                    time[j]++;
                }
            }
    
            int res = 0;
            for (int i = minTime; i <= maxTime; i++) {
                if (time[i] == 0) {  // 空载
                    res += 1;
                } else if (time[i] == 1) {  // 单任务
                    res += 3;
                } else {
                    res += 4;
                }
            }
    
            return res;
        }
    }
    
    
    • 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

    4、相似题目

  • 相关阅读:
    15 检验的优良性
    Qt 游戏场景 & 图元
    记一次经典SQL双写绕过题目[极客大挑战 2019]BabySQL 1
    ABB GFD563A101 3BHE046836R0101ABB GFD563A101 3BHE046836R0101
    elasticsearch的安全设置
    文本分析实验六-多层感知机、gensim、glove
    什么台灯最好学生晚上用?开学适合学生用的护眼台灯推荐
    java 下载文件名 编码
    python使用LRU缓存算法,利用带缓存的动态规划法求解斐波那契数列
    Swagger
  • 原文地址:https://blog.csdn.net/weixin_43763430/article/details/130757854