首页 > 试题广场 >

牛牛找工作

[编程题]牛牛找工作
  • 热度指数:323 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。

输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。


输出描述:
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
示例1

输入

3 3 
1 100 
10 1000 
1000000000 1001 
9 10 1000000000

输出

100 
1000 
1001

贪心

用最朴素的自然智慧可以想清楚这道题
1.相同难度的工作,只保留报酬高的;
2.难度高报酬低的工作不要。
在以上两个约束下,每个小伙伴都选择自己能力范围内报酬最高的工作
import java.io.*;
import java.util.*;
import java.util.Map.Entry;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().split(" ");
        int n = Integer.parseInt(params[0]);
        int m = Integer.parseInt(params[1]);
        TreeMap<Integer, Integer> map1 = new TreeMap<>();     // 难度->报酬
        for(int i = 0; i < n; i++){
            params = br.readLine().split(" ");
            int d = Integer.parseInt(params[0]), p = Integer.parseInt(params[1]);
            map1.put(d, Math.max(p, map1.getOrDefault(d, 0)));      // 相同的难度,只保留报酬高的
        }
        // 把难度高报酬低的工作过滤掉
        TreeMap<Integer, Integer> map2 = new TreeMap<>();
        Entry<Integer, Integer> preEntry = map1.firstEntry();
        map2.put(preEntry.getKey(), preEntry.getValue());
        for(Entry<Integer, Integer> e: map1.entrySet()){
            if(e.getValue() > preEntry.getValue()){
                map2.put(e.getKey(), e.getValue());
                preEntry = e;
            }
        }
        params = br.readLine().split(" ");
        for(int i = 0; i < m; i++){
            int Ai = Integer.parseInt(params[i]);
            int val = 0;
            if(map2.floorEntry(Ai) != null){
                val = map2.floorEntry(Ai).getValue();
            }
            System.out.println(val);
        }
    }
}

编辑于 2022-03-17 21:27:13 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.TreeSet;

class Node {
    int difficulty;
    int money;

    public Node() {
    }

    public Node(int difficulty, int money) {
        this.difficulty = difficulty;
        this.money = money;
    }
}

public class LookForJob {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String[] str1 = reader.readLine().split(" ");
        int N = Integer.parseInt(str1[0]);
        int M = Integer.parseInt(str1[1]);
        TreeSet<Node> workSet = new TreeSet<>(new Comparator<Node>() {
            @Override
            public int compare(Node o1, Node o2) {
                return o1.difficulty != o2.difficulty ? o1.difficulty - o2.difficulty : o2.money - o1.money;
            }
        });
        Node[] workNode = new Node[N];
        for (int i = 0; i < N; i++) {
            String[] s = reader.readLine().split(" ");
            workNode[i] = new Node(Integer.parseInt(s[0]), Integer.parseInt(s[1]));
        }
        Arrays.sort(workNode, new Comparator<Node>() {
            @Override
            public int compare(Node o1, Node o2) {
                return o1.difficulty != o2.difficulty ? o1.difficulty - o2.difficulty : o2.money - o1.money;
            }
        });
        int diff = -1;
        int money = -1;
        for (int i = 0; i < workNode.length; i++) {
            if (workNode[i].difficulty == diff || workNode[i].money <= money) {

            } else {
                workSet.add(workNode[i]);
                diff = workNode[i].difficulty;
                money = workNode[i].money;
            }
        }
        String[] s = reader.readLine().split(" ");
        for (int i = 0; i < M; i++) {
            Node node = new Node(Integer.parseInt(s[i]), 0);
            if(workSet.floor(node) == null){
                System.out.println(0);
            }else {
                System.out.println(workSet.floor(node).money);
            }
        }
    }
}

发表于 2022-06-03 15:40:29 回复(0)