第二题:性能瓶颈:(通过90%)
在单线程编程中经常会遇到性能瓶颈,在父任务中往会拥有多个子任务串行运行,子任务需要等待前一个任务完成才能获得资源运行,父任务则需要等待它当前持有的所有子任务完成才能继续进行它自身的计算,有时我们需要定位是代码中哪个部分消耗了最多的时间。时间(ms)
任务1包含了子任务2,子任务2又包含了其子任务3和4任务2自身的计算时间消耗1000-5-10-15=970秒。任务1自身的计算时间消耗2000-1-995=1004任务3,任务4消耗的时间分别为10与15。所以任务1消耗的时间是最长的。
思路如下:主要就是通过维护一个任务栈,子任务肯定是后开始先结束也就是后进栈先出栈,父任务肯定是先开始后结束也就是先进栈后出栈。具体逻辑如下:
1.输入遇到状态为0的任务(代表任务开始)就压栈,此时栈顶如果为空则代表改任务没有父任务,如果不为空则维护该任务为栈顶任务的子任务(用map),
2.碰到状态为1的任务(代表该任务结束)可以先判断该任务id与栈顶的任务id是否一致(如果不一致则说明是非法输入直接error结束),如果一致则直接出栈,并记录该任务的执行时长。
3.输入结束时,计算每个任务的真正执行时长并维护最大值即可(就是用记录的时常去减去所有子任务的执行时长即可,子任务已经在1过程种记录了)
4,还有很多要注意的判非(直接error的逻辑)逻辑需要自己思考,我代码中也有大部分了,但是应该还少一种...因为只通过了90%.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Stack;
class Node{
int t;
int id;
int flag;
public Node(int t1,int i,int f){
t=t1;
id=i;
flag=f;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
if(n%2==1){
System.out.println("error");
return ;
}
Stack<Node> st=new Stack<>();
HashMap<Integer, ArrayList<Integer>> Child=new HashMap<>();
int[] record=new int[n+1];
for(int i=0;i<n;i++){
int t=sc.nextInt();
int id=sc.nextInt();
int flag=sc.nextInt();
if(flag==1){
if(st.empty()){
System.out.println("error");
return ;
}
Node top=st.pop();
if(top.id!=id||top.flag!=0||top.t>t){
System.out.println("error");