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、参考代码
java
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;
}
}