公司食堂

公司食堂

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

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务