华为OD题目:快递投放问题

该文章描述了一个关于华为在线判题(OD)中的问题,涉及到快递在不同站点间的运输。给定每个站点的包裹信息和禁止通行的检查站,程序需找出无法正常投递的包裹并按升序输出。解题策略是使用HashMap存储包裹及其路径,遍历禁止信息并收集无法通行的包裹,最后排序并打印结果。
摘要由CSDN通过智能技术生成

华为OD题目:快递投放问题

有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,
每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递
输入描述
1、第一行输入M N,M个包裹N个道路信息
2、0<=M.N<=100
3、检查站禁止通行的包裹如果有多个以空格分开
输出描述
输出不能送达的包裹,如:package2 package4如果所有包惠都可以送达则输出: none
输出结果按照升序排列Q
示例1:
4 2
package1 A C
package2 A C
package3 B C
package4 A C
A B package1
A C package2
输出
package2
说明
4个包裹,2个禁止通行信息.
接下来的4行是每个包裹的名称,起点,终点。
最后2行是两个站点之间无法通行的包裹名称

4 2
package1 A C
package2 A C
package3 B C
package4 A C
A B package1
A C package2 package4
输出
package2 package4

解题思路:

  • 用hashmap来放包裹,key是路径,value是包裹set, 因为一条路径会有多个包裹
  • 然后遍历就,将禁止的包裹存放在list里面,排序后输出就可以了
public class My {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] strings = str.split(" ");
        int m = Integer.parseInt(strings[0]);
        int n = Integer.parseInt(strings[1]);

        Map<String, Set<String>> packageMap = new HashMap<>();
        for (int i = 0; i < m; i++) {
            String line = sc.nextLine();
            String[] split = line.split(" ");
            String packInfo = split[0];
            String road = split[1] + split[2];

            Set<String> set = packageMap.getOrDefault(road, new HashSet<>());
            set.add(packInfo);
            packageMap.put(road, set);
        }
        //下面是禁止的信息
        List<String> forbiddenList = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String line = sc.nextLine();
            String[] split = line.split(" ");
            String forbiddenRoad = split[0] + split[1];
            Set<String> packSet = packageMap.get(forbiddenRoad);
            //如果当前禁止的路段没有要运输的包裹,那么进入下个循环
            if (packSet == null || packSet.size() == 0) {
                continue;
            }
            for (int j = 2; j < split.length; j++) {
                String currForbid = split[j];
                if (packSet.contains(currForbid)) {
                    forbiddenList.add(currForbid);
                }
            }
        }
        forbiddenList.sort(String::compareTo);

        //下面是打印结果
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < forbiddenList.size(); i++) {
            if (i != 0) {
                sb.append(" ");
            }
            sb.append(forbiddenList.get(i));
        }
        System.out.println(sb);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值