集合框架题:PIPI发短信
问题:
思路:
单词与编号之间具有映射关系,而组内单词又由编号表示,因此单词与组之间的映射需通过编号作为桥梁
需发送的每个单词的cost是其所属组内单词的最小cost,因此需使用一个数组保存各组内单词的最小cost
我们需要知道每个单词属于哪个组,因此除了需创建map保存单词到编号的映射外,还需创建一个map保存编号到组的映射
为读取单词列表和cost列表,可以提前开好数组,数组大小为1e5 + 5
组内最小cost也用数组表示,提前开好
因此思路如下:
题目最终要问的是发送m个”单词”所需要的最小通信费用。
- 首先,”单词”跟”通信费用”并没有直接的联系,但两者都跟”编号”有联系,而所以我们先在”单词”与”编号”之间建立一个映射,之后通过查找”单词”的编号即可得到该单词的通信费用。
- 又由于所有单词会分为k组,所以我们使用另一个映射,保存每个编号所对应组号。
- 最后我们使用一个数组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