2023华为OD机试真题-求最大数字(JAVA、Python、C++)

文章描述了一个IT部门需要提升为子公司快速建立新站点的能力,涉及任务部署的优化问题。每个站点的建设由一系列具有固定部署时间的任务组成,任务间可能存在依赖关系。给定任务和依赖关系,目标是确定最短的开站时间。通过处理任务的依赖并行性,可以减少总的部署时间。示例展示了不同场景下的任务安排策略。
摘要由CSDN通过智能技术生成

题目描述:
当前IT部门支撑了子公司颗粒化业务,该部门需要实现为子公司快速开租建站的能力,建站是指在一个全新的环境部署一套IT服务。每个站点开站会由一系列部署任务项构成,每个任务项部署完成时间都是固定和相等的,设为1。部署任务项之间可能存在依赖,假如任务2依赖任务1,那么等任务1部署完,任务2才能部署。任务有多个依赖任务则需要等所有依赖任务都部署完该任务才能部署。没有依赖的任务可以并行部署,优秀的员工们会做到完全并行无等待的部署。给定一个站点部署任务项和它们之间的依赖关系,请给出一个站点的最短开站时间。
输入描述:
第一行是任务数taskNum,第二行是任务的依赖关系数relationsNum
接下来 relationsNum 行,每行包含两个id,描述一个依赖关系,格式为:IDi IDj,表示部署任务i部署完成了,部署任务j才能部署,IDi 和 IDj 值的范围为:[0, taskNum)
注:输入保证部署任务之间的依赖不会存在环。
输出描述:
一个整数,表示一个站点的最短开站时间。
补充说明:
1<taskNum<=100
1=<relationsNum<=5000
 收起
示例1
输入:
5
5
0 4
1 2
1 3
2 3
2 4
输出:
3
说明:
有5个部署任务项,5个依赖关系,如下图所示。我们可以先同时部署任务项0和任务项1,然后部署任务项2,最后同时部署任务项3和任务项4。最短开站时间为3。

示例2
输入:
5
3
0 3
0 4
1 3
输出:
2
说明:
有5个部署任务项,3个依赖关系,如下图所示。我们可以先同时部署任务项0,任务项1,任务项2。然后再同时部署任务项3和任务项4。最短开站时间为2。
 

import java.util.*;
 
public class Main  {
 
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int taskCnt = sc.nextInt();
        int relations = sc.nextInt();
        Map<Integer, List<Integer>> dependencyMap = new HashMap<>();
        Map<Integer, List<Integer>> toMap = new HashMap<>();
        for (int i = 0; i < relations; i++) {
            int from = sc.nextInt();
            int to = sc.nextInt();
            if (!dependencyMap.containsKey(to)) {
                dependencyMap.put(to, new ArrayList<>());
            }
            dependencyMap.get(to).add(from);
 
            //toMap
            if (!toMap.containsKey(from)) {
                toMap.put(from, new ArrayList<>());
            }
            toMap.get(from).add(to);
        }
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < taskCnt; i++) {
            set.add(i);
        }
        set.removeIf(dependencyMap::containsKey);
 
        int ans = 0;
        Set<Integer> visited = new HashSet<>();
        Deque<Integer> queue = new ArrayDeque<>(set);
        while (!queue.isEmpty()) {
            Set<Integer> toVisit = new HashSet<>();
            Set<Integer> visitNow = new HashSet<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                Integer pop = queue.pop();
                // 拿到某个节点,判断当前节点的所有依赖是否已被访问过
                List<Integer> integers = dependencyMap.get(pop);
                if (integers == null || integers.size() == 0 || visited.containsAll(integers)) {
                    // 当前节点可以访问
                    visitNow.add(pop);
                    List<Integer> tos = toMap.get(pop);
                    if(tos != null && tos.size() > 0){
                        toVisit.addAll(tos);
                    }
                } else {
                    // 有依赖还没有访问
                    toVisit.add(pop);
                }
            }
            queue.addAll(toVisit);
            visited.addAll(visitNow);
                ans++;
        }
        System.out.println(ans);
    }
}
 
 
 
tasknum,relationsNum= int(input()),int(input())
relamatrix = []
for i in range(relationsNum):
    relamatrix.append(list(map(int,input().split(" "))))
rear = {} 
st = [0 for _ in range(tasknum)]
s = []
atime = 1
 
for rela in relamatrix:
    x,y = rela
    if x not in rear.keys():
        rear[x] = [y]
    else:
        rear[x].append(y)
    st[y] = st[y] + 1
 
 
for i in range(tasknum):
    if st[i] == 0:
        s.append((i,atime))
        
           
while len(s) > 0:
    x,y = s.pop(0)
    if rear.get(x) is not None and len(rear[x]) > 0:
        for i in rear[x]:
            st[i] -= 1
            if st[i] == 0:
                atime = y + 1
                s.append((i,atime))
print(atime)
    
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
 
int main() {
    int taskNum, relationNum;
    cin >> taskNum >> relationNum;
    vector<int> suffixNodes[taskNum];
    vector<int> prefixNodeNum(taskNum, 0);
    while (relationNum--) {
        int prefix, postfix;
        cin >> prefix >> postfix;
        suffixNodes[prefix].emplace_back(postfix);
        prefixNodeNum[postfix]++;
    }
    queue<int> taskNode;
    for (int i = 0; i < taskNum; ++i) if (!prefixNodeNum[i]) taskNode.push(i);
    int res = 0;
    while (taskNode.size()) {
        int n = taskNode.size();
        while (n--) {
            int curTask = taskNode.front();
            taskNode.pop();
            for (auto node : suffixNodes[curTask]) {
                prefixNodeNum[node]--;
                if (!prefixNodeNum[node]) taskNode.push(node);
            }
        }
        ++res;
    }
    cout << res;
    return 0;
}

首先,在选择服务中心的最佳位置时,我们需要考虑各种因素,包括人口密度、交通便利性、基础设施和竞争对手等。对于华为OD项目来说,我会推荐选址在人口密度相对较高的城市中心地带。这样可以确保服务中心能够覆盖到更多的用户群体,提高服务的便利性和覆盖面。 其次,交通便利性也是选择最佳位置的重要考量因素。一个位于交通枢纽地带的服务中心可以更容易地接触到周围城市的用户,减少用户的前往成本和时间。同时,也方便快速调度和配送产品,提高服务的效率和时效性。 此外,基础设施的完善也是一个重要的考虑因素。一个服务中心应该有稳定的电力、通讯和网络设施,以保证服务的持续性和稳定性。另外,周边商业设施和生活设施的配套也能吸引更多的顾客和员工,提高服务中心的吸引力和竞争力。 最后,对竞争对手的考虑也至关重要。在选择服务中心的位置时,需要做好竞争对手的地域分析,避免选择在竞争对手的聚集地带,同时也要考虑如何在竞争对手密集的区域提供更优质的服务和更吸引人的特色,以获得竞争优势。 综上所述,选择服务中心最佳位置需要全面考虑各种因素,包括人口密度、交通便利性、基础设施和竞争对手,这样才能确保服务中心能够更好地为用户提供服务,同时也能提高企业的竞争力和影响力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值