• 阿里在线测评解析


    题干:

    今天我们看到的阿里巴巴提供的任何一项服务后边都有着无数子系统和组件的支撑,子系统之间也互相依赖关联,

    其中任意一个环节出现问题都可能对上游链路产生影响。小明做为新人接收到的第一个任务就是去梳理所有的依赖关系,

    小明和每个系统的负责人确认了依赖关系,记录下调用对应系统的耗时,用这些数据分析端到端链路的数目和链路上最长的耗时。

    输入: 小明搜集到的系统耗时和依赖列表

    5 4 // 表示有5个系统和 4个依赖关系

    3 // 调用1号系统耗时 3 ms

    2 // 调用2号系统耗时 2 ms

    10 // 调用3号系统耗时 10 ms

    5 // 调用4号系统耗时 5 ms

    7 // 调用5号系统耗时 7 ms

    1 2 // 2号系统依赖1号系统

    1 3 // 3号系统依赖1号系统

    2 5 // 2号系统依赖5号系统

    4 5 // 4号系统依赖5号系统

    输出: 调用链路的数目 和最大的耗时, 这里有三条链路1->2->5,1->3, 4->5,最大的耗时是1到3的链路 3+10 = 13,无需考虑环形依赖的存在。

    3 13

    思路:

    一个很不错的题目,不过能在半个小时内做出来还是有点小难度的,主要是用到了一个深搜的思路,将所有依赖关系存在一个map中,从头节点开始向下搜索,有点链表的意思。

    每搜到一个尾节点就将结果加1;

    代码:

    #include <iostream>
    #include <map>
    #include <algorithm>
    #include <vector>
    #include <stdlib.h>
    #include <string.h>
    using namespace std;
    vector <int > timeUse;
    vector <int > path;
    multimap <int ,int > dependency;
    bool head[100000+5];
    int maxTime = 0,Time = 0;
    int res = 0;
    void findPath(int point) {
        multimap <int ,int >::iterator iter;
        path.push_back(point);
        Time += timeUse[point];
        iter = dependency.find(point);
        if(iter != dependency.end()) {
            int num = dependency.count(point);
            while(num--) {
                findPath(iter->second);
                iter++;
            }
        } else {
            res++;
            maxTime = max(maxTime,Time);
        }
        Time -= timeUse[point];
        path.pop_back();
    }
    int main() {
        int sysNum, dependList;
        while(cin >> sysNum >> dependList) {
            timeUse.clear();
            dependency.clear();
            path.clear();
            maxTime = 0,res = 0;
            memset(head,1,100005);
            timeUse.push_back(0);
            for(int i = 1; i <= sysNum; i++){
                cin >> Time;
                timeUse.push_back(Time);
            }
    
            for(int i = 1; i <= dependList; i++)
            {
                int sysLeader, sysFollower;
                cin >> sysLeader >> sysFollower;
                dependency.insert(make_pair(sysLeader,sysFollower));
                head[sysFollower] = 0;
            }
            for(int i = 1; i <= sysNum; i++)
                if(head[i]) {
                    Time = 0;
                    findPath(i);
                }
            cout << res << " " << maxTime << endl;
        }
        return 0;
    
    }
    /*
    5 4
    3 2 10 5 7
    1 2
    1 3
    2 5
    4 5
    */
    宝剑锋从磨砺出 梅花香自苦寒来
  • 相关阅读:
    lightoj-1047
    lightoj-1044
    lightoj-1045
    lightoj-1082
    LeetCode偶尔一题 —— 19. 删除链表的倒数第N个节点
    Python 3.52官方文档翻译 http://usyiyi.cn/translate/python_352/library/index.html 必看!
    Python3 time模块
    JavaScript CSS 等前端推荐
    Python之 七级字典查询
    将Sublime Text 3设置为Python全栈开发环境(转一个链接)
  • 原文地址:https://www.cnblogs.com/GHzcx/p/9409446.html
Copyright © 2020-2023  润新知