AssembleReliableDevice

import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int budget = sc.nextInt();
        int typeNum = sc.nextInt();
        int n = sc.nextInt();
        HashMap<Integer, PriorityQueue<int[]>> components = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int id = sc.nextInt();
            int reliable = sc.nextInt();
            int price = sc.nextInt();
            components.putIfAbsent(id, new PriorityQueue<>((a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]));
            components.get(id).offer(new int[]{reliable, price});
        }
        System.out.println(get(budget, typeNum, components));
    }

    private static int get(int budget, int typeNum, HashMap<Integer, PriorityQueue<int[]>> components) {
        int priceSum = 0;
        int minReliable = Integer.MAX_VALUE;
        PriorityQueue<int[]> choice = new PriorityQueue<>((a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]);
        for (Integer id : components.keySet()) {
            PriorityQueue<int[]> queue = components.get(id);
            if (!queue.isEmpty()){
                int[] poll = queue.poll();
                choice.offer(new int[]{id, poll[0], poll[1]});
                priceSum += poll[1];
                minReliable = Math.min(minReliable, poll[0]);
            }
        }

        if (choice.isEmpty() || choice.size() < typeNum || priceSum > budget) return -1;
        while (priceSum < budget){
            int[] poll = choice.poll();
            int id = poll[0];
            int re = poll[1];
            int pr = poll[2];
            minReliable = Math.max(minReliable, re);
            if (!components.get(id).isEmpty()){
                int[] high = components.get(id).poll();
                int hRe = high[0];
                int hPr = high[1];
                choice.offer(new int[]{id, hRe, hPr});
                priceSum += hPr - pr;
            }else {
                return minReliable;
            }
        }
        return minReliable;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值