公司食堂
公司食堂
http://www.nowcoder.com/questionTerminal/601815bea5544f389bcd20fb5ebca6a8
这道题有思路,但是是很简单的暴力解题思路。感觉写起来太麻烦了,就考虑有什么数据结构能来帮助我减少遍历的次数,想了哈希表,链表...就是没想到用小根堆。
学到了学到了~~
以下是评论区第一的大佬题解:
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] agrs) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(reader.readLine());
for(int i = 0; i < T; i++){
int N = Integer.parseInt(reader.readLine());
String tables = reader.readLine();
int M = Integer.parseInt(reader.readLine());
String genders = reader.readLine();
int[] res = solve(tables, genders);
for(int r : res){
writer.write(Integer.toString(r));
writer.newLine();
}
}
writer.flush();
}
public static int[] solve(String tables, String genders){
//两个小顶堆
List<PriorityQueue<Integer>> pqs = new ArrayList<>(2);
pqs.add(new PriorityQueue<>());
pqs.add(new PriorityQueue<>());
for(int i = 0; i < tables.length(); i++){
if(tables.charAt(i) == '2')
continue;
pqs.get(tables.charAt(i) - '0').add(i);
}
int[] res = new int[genders.length()];
for(int i = 0; i < genders.length(); i++){
int table;
if(genders.charAt(i) == 'M'){
if(pqs.get(1).isEmpty()){
table = pqs.get(0).poll();
pqs.get(1).add(table);
} else{
table = pqs.get(1).poll();
}
} else{
if(!pqs.get(0).isEmpty()){
table = pqs.get(0).poll();
pqs.get(1).add(table);
}else{
table = pqs.get(1).poll();
}
}
res[i] = table + 1;
}
return res;
}
}搭配出售的最大获利
这道题是有思路的,想要获得最大利润,就尽量搭配出更多的价格更高的出售。但是有一一对应关系,就想不到用什么数据结构来进行存储。
看了评论区才发现,可以用大根堆来存储二元组,还能达到比较大小的作用。
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] params = br.readLine().trim().split(" ");
int a = Integer.parseInt(params[0]);
int b = Integer.parseInt(params[1]);
int c = Integer.parseInt(params[2]);
int d = Integer.parseInt(params[3]);
int e = Integer.parseInt(params[4]);
int f = Integer.parseInt(params[5]);
int g = Integer.parseInt(params[6]);
// 将三种搭配放入一个大根堆中,按照三种搭配的获利对搭配进行降序排列
PriorityQueue<int[]> maxHeap = new PriorityQueue<>((int[] w1, int[] w2) -> w2[1] - w1[1]);
maxHeap.offer(new int[]{a, e});
maxHeap.offer(new int[]{b, f});
maxHeap.offer(new int[]{c, g});
// 把衬衫分配给领带、裤子和帽子中赚钱多的
long money = 0;
while(!maxHeap.isEmpty() && d > 0){
int[] temp = maxHeap.poll();
money += (long)Math.min(temp[0], d) * temp[1];
d -= temp[0];
}
System.out.println(money);
}
}题目地址:https://www.nowcoder.com/questionTerminal/02a76c341e6d4cf5a1467ea9b3d6ec3b?f=discussion
查看3道真题和解析