公司食堂
公司食堂
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