集合框架题:PIPI发短信

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。集合框架题:PIPI发短信,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

集合框架题:PIPI发短信

问题:

在这里插入图片描述
在这里插入图片描述

思路:

单词与编号之间具有映射关系,而组内单词又由编号表示,因此单词与组之间的映射需通过编号作为桥梁

需发送的每个单词的cost是其所属组内单词的最小cost,因此需使用一个数组保存各组内单词的最小cost

我们需要知道每个单词属于哪个组,因此除了需创建map保存单词到编号的映射外,还需创建一个map保存编号到组的映射

为读取单词列表和cost列表,可以提前开好数组,数组大小为1e5 + 5
组内最小cost也用数组表示,提前开好

因此思路如下:
题目最终要问的是发送m个”单词”所需要的最小通信费用。

  1. 首先,”单词”跟”通信费用”并没有直接的联系,但两者都跟”编号”有联系,而所以我们先在”单词”与”编号”之间建立一个映射,之后通过查找”单词”的编号即可得到该单词的通信费用。
  2. 又由于所有单词会分为k组,所以我们使用另一个映射,保存每个编号所对应组号。
  3. 最后我们使用一个数组group_min保存每一组中所需通信费用最小的单词的通信费用。
    每一次即可通过这样一个逻辑: “单词”->”编号”->”组号”->该组内最小通信费用 ,来得到发送某个单词所需的最小通信费用。

代码:

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
 
public class Main {
    public static final int LIMIT = 100005;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int k = scanner.nextInt();
        Map<String, Integer> wordToNum = new HashMap<>();
        Map<Integer, Integer> numToGroup = new HashMap<>();
        String[] wordsArray = new String[LIMIT];
        long[] groupMin = new long[LIMIT];
        long[] costArray = new long[LIMIT];
        Arrays.fill(groupMin, 1000000005);
        scanner.nextLine();
        int i;
        for (i = 0;i < n;i++) {
            wordsArray[i] = scanner.next();
        }
        scanner.nextLine();
        for (i = 0;i < n;i++) {
            costArray[i] = scanner.nextLong();
        }
        for (i = 0;i < n;i++) {
            wordToNum.put(wordsArray[i], i + 1);
        }
        int groupId;
        int num;
        int total;
        int j;
        for(i = 0;i < k;i++) {
            groupId = i;
            total = scanner.nextInt();
            for (j = 0;j < total;j++) {
                num = scanner.nextInt();
                groupMin[i] = Math.min(groupMin[i], costArray[num - 1]);
                numToGroup.put(num, groupId);
            }
        }
        scanner.nextLine();
        String message;
        long ans = 0;
        for (i = 0;i < m;i++) {
            message = scanner.next();
            num = wordToNum.get(message);
            groupId = numToGroup.get(num);
            ans += groupMin[groupId];
        }
        System.out.println(ans);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153762.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!