一 任务混部
公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你设计算法帮他们
解决一个任务混部问题:有taskNum 项任务,每个任务有开始时间(startTime
),结束时间(endTime),并行度(parallelism)三个属性,并行度是指这个任务运行时将
会占用的服务器数量,一个服务器在每个时刻可以被任意任务使用但最多被一个任务占用
,任务运行完会立即释放(结束时刻不占用)。任务混部问题是指给定一批任务,让这批
任务由同一批服务器承载运行,请你计算完成这批任务混部最少需要多少服务器,从而最
大化控制资源成本。
输入描述
第一行输入为taskNum,表示有taskNum 项任务
接下来taskNum 行,每行三个整数,表示每个任务的开始时间(startTime
),结束时间(endTime),并行度(parallelism)
输出描述
一个整数,表示最少需要的服务器数量
package com.zxl.od.sf;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Demo1 {
/**
* 第一行输入为taskNum,表示有taskNum项任务
* 接下来taskNum行,每行三个整数,表示每个任务的开始时间(startTime ),结束时间(endTime),并行度(parallelism)
*
* 3
* 2 3 1
* 6 9 2
* 0 5 1
*
* @param args
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int taskNum = sc.nextInt();
List<Task> tasks = new ArrayList<>();
for (int i = 0; i < taskNum; i++) {
Task task = new Task(sc.nextInt(), sc.nextInt(), sc.nextInt());
tasks.add(task);
}
System.out.println(tasks);
int[] arrr = new int[10000];
for (int i = 0; i < tasks.size(); i++) {
Task task = tasks.get(i);
arrr[task.startTime] += task.parallelism;
arrr[task.endTime] -= task.parallelism;
}
int totalServerNum = 0;
int result = 0;
for (int i = 0; i < arrr.length; i++) {
int i1 = arrr[i];
totalServerNum += i1;
result = Math.max( totalServerNum , result);
}
System.out.println(result);
}
public static class Task {
public int startTime;
public int endTime;
public int parallelism;
public Task(int startTime, int endTime, int parallelism) {
this.startTime = startTime;
this.endTime = endTime;
this.parallelism = parallelism;
}
@Override
public String toString() {
return "Task{" +
"startTime=" + startTime +
", endTime=" + endTime +
", parallelism=" + parallelism +
'}';
}
}
}
二 单词倒叙
题目描述
输入单行英文句子,里面包含英文字母,空格以及,.?
三种标点符号,请将句子内每个单词进行倒序,并输出倒序后的语句
输入描述
输入字符串S,S 的长度1≤N≤100
输出描述
输出逆序后的字符串
package com.zxl.od.sf;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Demo2 {
/**
* 输入单行英文句子,里面包含英文字母,空格以及,.?
* 三种标点符号,请将句子内每个单词进行倒序,并输出倒序后的语句
* 输入描述
* 输入字符串S,S 的长度1≤N≤100
* 输出描述
* 输出逆序后的字符串
*/
//the,sky.is blue?
//woh era uoy ?I ma enif.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
System.out.println(s);//woh era uoy ?I ma enif.
String ret = "";
for (String s1 : s.split(",")) {
for (String s2 : s1.split("\\.")) {
for (String s3 : s2.split(" ")) {
for (String s4 : s3.split("\\?")) {
if (s4 != null && !"".equals(s4)) {
ret += fanzhuan(s4);
}
}
}
}
}
System.out.println(ret);//howareyouIamfine
//将符号组装回去
char[] retarr = ret.toCharArray();
char[] chars = s.toCharArray();
List<Character> strings = Arrays.asList(',', ' ', '?', '.');
ArrayList<Object> objects = new ArrayList<>();
int offest = 0;
for (int i = 0; i < chars.length; i++, offest++) {
char c = chars[i];
if (strings.contains(c)) {
offest -= 1;
objects.add(chars[i]);
} else {
objects.add(retarr[offest]);
}
}
String a = "";
for (Object object : objects) {
a += object;
}
System.out.println(a);//how are you ?I am fine.
}
private static String fanzhuan(String s3) {
String ret = "";
char[] chars = s3.toCharArray();
for (int i = chars.length - 1; i >= 0; i--) {
ret += chars[i];
}
return ret;
}
}