Codeforces - 1089L. Lazyland

发布于 2024-04-20 13:19:38 字数 3334 浏览 13 评论 0

题目大意

一个 懒岛 ​,有 n 个懒人( idlers ),国王给这 n 个懒人分配 k 个任务,告诉你懒人们选择的任务编号 a[] ,现在的问题是,有些人选择了同样的任务,使得有些任务没有人做,于是国王要和这些选择了重复任务的某些人谈判,要他们选择别的任务,和每个人谈判有一个耗费的时间 b[] ,现在要你求国王和哪些人谈判使得所有任务都有人做,且时间最少,求最少的时间。

解析

这个题目我是用优先队列(大根堆) 来维护最小的没有人选择的岗位的几个时间:

  • 使用 set 去重,判断没有重复的工作总共有多少个,如果 k - set.size() == 0 则表示所有工作都有人选择了,则输出 0
  • 否则,遍历 n ,先判断这个工作选择的人是否 > 1 ,如果不大于,就不要考虑了;
  • 否则就要选择这些人,但是只能选择 noChoseJob ,于是维护一个 noChoseJob 大小的堆,并使用个 map 来记录相同工作之间时间的最大值;
import java.io.*;
import java.util.*;

public class Main {

    final static int MAX = 100000;

    public static void main(String[] args) {
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        PrintStream out = System.out;
        int n = cin.nextInt(), k = cin.nextInt(); // idlers num , jobs num
        HashSet<Integer> set = new HashSet<>(); // judge
        int[] a = new int[n], b = new int[n];
        int[] times = new int[MAX];
        for (int i = 0; i < n; i++) {
            a[i] = cin.nextInt();
            set.add(a[i]);
            times[a[i]]++; // record the job be chosen number of times
        }
        for (int i = 0; i < n; i++)
            b[i] = cin.nextInt();
        int noChose = k - set.size(); 
        if (noChose == 0) { // all idlers have job
            out.println(0);
            return;
        }
        Queue<Integer> pq = new PriorityQueue<>((o1, o2) -> o2 - o1); // the big heap
        HashMap<Integer, Integer> maxMap = new HashMap<>();

        for(int i = 0; i < n; i++){
            if(times[a[i]] <= 1)
                continue;
            if(maxMap.get(a[i]) == null){
                maxMap.put(a[i], b[i]);
            }else{
                Integer pMax = maxMap.get(a[i]); 
                if(pMax < b[i]){
                    if(noChose == pq.size()){
                        if(pMax < pq.peek()) {
                            pq.poll();
                            pq.add(pMax);
                        }
                    }else { // if pq.size < noChoseJob, add directly
                        pq.add(pMax);
                    }
                    maxMap.put(a[i], b[i]); // update max
                }else {  // add b[i] to the pq directly
                    if(noChose == pq.size()){
                        if(b[i] < pq.peek()) {
                            pq.poll();
                            pq.add(b[i]);
                        }
                    }else {
                        pq.add(b[i]);
                    }
                }
            }
        }
        long res = 0;  // notice, must long
        while(!pq.isEmpty())
            res += pq.poll();
        out.println(res);
    }
}

题目链接

http://codeforces.com/problemset/problem/1089/L

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

み零

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文